Caliburn Micro и Castle Windsor Bootstrapper - Регистрация классов моделей в загрузчике - PullRequest
0 голосов
/ 31 октября 2011

Я использую загрузчик Castle Windsor в своем приложении WPF.Я попытался зарегистрировать классы модели представления в контейнере Windsor.

У меня есть все классы моделей представления в пространстве имен sample.viewmodels

Итак, я попробовал это:

        _windsorContainer.Register(AllTypes.FromAssembly(GetType().Assembly)
                                       .Where(x => x.Namespace.EndsWith("ViewModels"))
                                       .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));

Или вот такдля регистров просмотра классов модели в контейнер:

    _windsorContainer.Register(AllTypes.FromAssembly(GetType().Assembly)
                                   .Where(x => x.Namespace.Equals("Sample.ViewModels"))
                                   .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));

Этот способ не работает.Я не знаю почему.MainViewModel / ChildViewModel свойство имеет значение null.

Если я использую этот стиль, он хорошо работает.

        ////Shell
        _windsorContainer.Register(
            Component.For<IShellViewModel>()
                .ImplementedBy<ShellViewModel>()
                .LifeStyle.Is(LifestyleType.Singleton));

        //Main screen
        _windsorContainer.Register(
            Component.For<IMainViewModel>()
                .ImplementedBy<MainViewModel>()
                .LifeStyle.Is(LifestyleType.Singleton));

        //Child screen
        _windsorContainer.Register(
            Component.For<IChildViewModel>()
                .ImplementedBy<ChildViewModel>()
                .LifeStyle.Is(LifestyleType.Singleton));

Что плохого в первом случае?

Здесь у меня есть модели представления:

namespace Sample.ViewModels
{
    public interface IShellViewModel
    {}

    public class ShellViewModel : Conductor<IScreen>.Collection.AllActive,
        IShellViewModel
    {
        public IMainViewModel MainViewModel { get; set; }

        public IChildViewModel ChildViewModel { get; set; }

        protected override void OnInitialize()
        {
            DisplayName = "Castle Windsor Boostraper";
            base.OnInitialize();
        }
    }

    public interface IMainViewModel : IScreen
    {
        void SayHello();
    }

    public class MainViewModel : Screen, IMainViewModel
    {
        public void SayHello()
        {
            MessageBox.Show("Hello from MainViewModel");
        }
    }
    public interface IChildViewModel : IScreen
    {
        void SayHello();
    }

    public class ChildViewModel : Screen, IChildViewModel
    {
        public void SayHello()
        {
            MessageBox.Show("Hello from ChildViewModel");
        }
    }
}

РЕДАКТИРОВАНИЕ:

Я немного обновил регистрационную часть:

        _windsorContainer.Register(AllTypes.FromAssembly(GetType().Assembly)
                                       .Pick()
                                       .WithService.DefaultInterface()
                                       .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));

Это работает, но я не уверен, что это лучший способ.

Ответы [ 2 ]

2 голосов
/ 17 февраля 2012

Я думаю, что вы хотите сделать что-то вроде этого, чтобы зарегистрировать ваши view-модели в Castle Windosr

_windsorContainer.Register(AllTypes.FromThisAssembly()
    .Where(x => x.Namespace.EndsWith("ViewModels"))
    .WithService.AllInterfaces()
    .WithService.Self()
    .If(s => !s.IsAbstract)
    .Configure(x => x.LifeStyle.Is(LifestyleType.Singleton)));

Но мне интересно, почему вы регистрируете ваши view-модели как синглтон?Я бы зарегистрировал их как временные, чтобы вы могли создать несколько разных моделей представления для одного и того же представления в приложении.Я также использую маркерный интерфейс для своих моделей представления, поэтому мне не нужно полагаться на модели представления, находясь в пространстве имен, которое заканчивается на «ViewModels».

_windsorContainer.Register(Classes
    .FromThisAssembly()
    .BasedOn<IViewModelBase>()
    .WithServiceAllInterfaces()
    .WithServiceSelf()
    .LifestyleTransient()
1 голос
/ 31 октября 2011

в первом примере вы регистрируете только конкретные типы как одиночные, во втором примере соответствующие интерфейсы ассоциируются с реализациями. поскольку ваши свойства представляют модели как интерфейсы, первая часть кода не сможет удовлетворить эти свойства.

...