Caliburn Micro и Windsor Castle Boostraper {Нет компонента для поддержки сервиса} - PullRequest
1 голос
/ 17 октября 2011

Привет, я пытаюсь использовать Windosor Castle с Caliburn Micro. До сих пор я использую только MEF.

Я основал этот замок Boosterper: https://gist.github.com/1127914

Я добавил эти вызовы в свой проект и изменил файл App.xaml:

<Application x:Class="Chroma_Configer.App"
             xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
             xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
             xmlns:Bootstraper="clr-namespace:Chroma_Configer.Bootstraper">
    <Application.Resources>
        <ResourceDictionary>
        <ResourceDictionary.MergedDictionaries>
            <ResourceDictionary>
                    <Bootstraper:CastleBootstrapper x:Key="bootstrapper" />

                <Style x:Key="MainView_FontBaseStyle" TargetType="{x:Type Control}">
                    <Setter Property="FontFamily" Value="Arial"/>
                </Style>
            </ResourceDictionary>
        </ResourceDictionary.MergedDictionaries>

    </ResourceDictionary>
    </Application.Resources>
</Application>

Я создаю ShellView (WPF) и ShellViewModel:

public interface IShellViewModel
{

}


public class ShellViewModel : Conductor<IScreen>.Collection.OneActive,
    IShellViewModel
{

}

Когда я бегу, я получаю эту ошибку:

{"No component for supporting the service Chroma_Configer.ViewModels.IShellViewModel was found"}

Я новичок в Виндзорском замке. Я знаю, что он работает примерно так:

        var container = new WindsorContainer();
        container.AddComponent("JsonUtil", typeof(IShellViewModel), typeof(ShellViewModel));

        var shell = container.Resolve<IShellViewModel>();

В MEF I пользовательский атрибут [Экспорт] и [Импорт]. Может ли кто-нибудь мне помочь с этой проблемой?

Другой вопрос, что у меня есть некоторый класс инструментов:

public interface ITooll{}

public class Tool:ITool{}

и я хотел бы импортировать это в класс ShellViewModel.

Как я могу сделать это с CastleBoostraper?

1 Ответ

2 голосов
/ 17 октября 2011

Вам необходимо зарегистрировать ваши виды моделей и видов в контейнере. Старая версия Windsor работала на основе атрибутов, но в последней версии вы можете сделать это с помощью свободно распространяемого API или даже массового регистра на основе некоторого соглашения:

public class Bootstrapper : Bootstrapper<IShellViewModel>
{
    protected override IServiceLocator CreateContainer()
    {
        _container = new WindsorContainer();
        var adapter = new WindsorAdapter(_container);
        _container.Register(Component.For<ITool>().ImplementedBy<Tool>().LifeStyle.Transient);

        return adapter;
    }
}

Вы также можете создать Установщики, которые будут регистрировать типы в контейнере, чтобы ваш код Bootstrapper не заканчивался большим количеством регистрационного кода:

public class ShellRegistration : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Register(Component.For<ITool>().ImplementedBy<Tool>().LifeStyle.Transient);
        //Register other types
    }
}

И назовите его в загрузчике:

public class Bootstrapper : Bootstrapper<IShellViewModel>
{
    protected override IServiceLocator CreateContainer()
    {
        _container = new WindsorContainer();
        var adapter = new WindsorAdapter(_container);
        _container.Install(FromAssembly.This());

        return adapter;
    }
}

Посмотрите пример приложения Silverlight Я создал, чтобы узнать, как работать с Castle Windsor.

Вы можете получить экземпляры ваших зависимостей, используя Constructor Injection или Property Injection, что-то встроенное в это:

public class ShellViewModel
{
    public ShellViewModel(IMyDependency dependency)
    {
       //you'll get an instance of the class implementing IMyDependency
       //Logger property will be injected after construction
    }

    public ILog Logger
    {
        get; set;
    }
}
...