Hello,

I'm trying to use Castle.Windsor as part of prism.
I've encounterd an issue related to my usage of windsor for resolving
views and view models.
I have the ViewModel that gets a reference to a view in the
constructor.
I see that the view's constructor gets called twice instead of once,
if I don't use singleton registration.

Is this a bug? Am I doing something wrong?
Any suggestions please?

Thanks
Ron

Here's a simplified version of the code:

using System;
using Castle.Core;
using Castle.MicroKernel.Registration;
using Castle.Windsor;

namespace WindsorIssue
{
    public interface IViewModel
    {
        IView View { get; set; }
    }

    public class ViewModel : IViewModel
    {
        public IView View { get; set; }

        public ViewModel(IView view)
        {
            View = view;
            Console.WriteLine("In ViewModel constructor");
        }
    }

    public interface IView
    {
    }

    public class View : IView
    {
        public View()
        {
            Console.WriteLine("In View Constructor");
        }
    }
    class Program
    {
        private WindsorContainer Container { get; set; }
        static void Main(string[] args)
        {
            Program myProgram = new Program {Container = new
WindsorContainer()};

            myProgram.RegisterTypeIfMissing<IView, View>(false);
            myProgram.RegisterTypeIfMissing<IViewModel,
ViewModel>(false);

            IViewModel viewModel =
myProgram.GetInstance<IViewModel>();
            IView view = viewModel.View;

        }

        public void RegisterTypeIfMissing<TServiceType,
TClassType>(bool registerSingleton)
            where TClassType : class, TServiceType
        {
            if (IsTypeRegistered(Container, typeof(TServiceType)))
            {
                return;
            }
            Container.Kernel.Register(
                Component.For<TServiceType>()
                    .ImplementedBy<TClassType>()
                    .LifeStyle.Is(registerSingleton ?
LifestyleType.Singleton : LifestyleType.Transient)
                );
        }

        public static bool IsTypeRegistered(IWindsorContainer
container, Type type)
        {
            return container.Kernel.HasComponent(type);
        }

        public TService GetInstance<TService>()
        {
            Type serviceType = typeof(TService);
            if (serviceType.IsClass)
            {
                RegisterType<TService, TService>(Container, false);
            }
            return (TService)Container.Resolve(serviceType);
        }

        public static void RegisterType<TServiceType,
TClassType>(IWindsorContainer container, bool singleton)
        {
            if (!container.Kernel.HasComponent(typeof(TServiceType)))
            {
                container.Kernel.Register(
 
Component.For(typeof(TServiceType)).ImplementedBy(typeof(TClassType)).Named(
 
typeof(TClassType).FullName).LifeStyle.Is(singleton
                                                                       ?
LifestyleType.Singleton
                                                                       :
LifestyleType.Transient));
            }
        }
    }
}

-- 
You received this message because you are subscribed to the Google Groups 
"Castle Project Users" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to 
[email protected].
For more options, visit this group at 
http://groups.google.com/group/castle-project-users?hl=en.

Reply via email to