Потерянный в конфигурации мультитенантного Виндзорского замка - PullRequest
0 голосов
/ 16 июня 2011

Я использую Windsor Castle с IHandlerSelector для реализации с несколькими арендаторами.

У меня есть две формы FrmInvoice и пользовательский FrmInvoiceCustomer1 общий интерфейс IFrmInvoice.Я хочу переключить их с помощью моего класса селектора.

public interface IFrmInvoice
{
   void Show();
}

container.Kernel.AddHandlerSelector(
            new FrmInvoiceSelector(
                new Type[] { typeof(IFrmInvoice) }));

Формы зарегистрированы с этим кодом:

 container.Register(AllTypes.FromThisAssembly()
                            .Pick()
                            .If(t => t.Name.StartsWith("Frm"))
                            .Configure((c => c.LifeStyle.Transient)));

Моя основная форма с кнопкой с этим кодом:

private void button1_Click(object sender, EventArgs e)
{
    IFrmInvoice form1 = formsFactory.CreateForm<IFrmInvoice>();
    form1.Show();
}

Теперь я спрашиваю: как я могу зарегистрировать интерфейс IFrmInvoice в контейнере Windsor?Это правильный способ сделать это?

обновление

Я думаю, что я очень близок.Таким образом, он работает, но он регистрирует все интерфейсы, используемые моими классами!Есть лучший способ?

 container.Register(AllTypes.FromAssemblyContaining<IFrmInvoice>()
              .BasedOn(typeof(IFrmInvoice)).WithService.AllInterfaces());

Ответы [ 3 ]

0 голосов
/ 16 июня 2011

хорошо, я нашел решение:

container.Register(Component.For<IFrmInvoice>().ImplementedBy<IFrmInvoice>());
0 голосов
/ 16 июня 2011

Хорошо, теперь я вижу .. мы регистрируемся таким образом:

public class ComponentsInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        var allTypesFromBinDir = AllTypes.FromAssemblyInDirectory(new AssemblyFilter(HttpRuntime.BinDirectory));

        container.Register(allTypesFromBinDir
            .BasedOn<IComponentService>()
            .WithService.FromInterface());
    }
}
0 голосов
/ 16 июня 2011

Используйте реализацию установщика Windsor, например:

public class SampleInstaller : IWindsorInstaller
{
    public void Install(IWindsorContainer container, IConfigurationStore store)
    {
        container.Kernel.AddHandlerSelector(new InvoiceHandlerSelector());
    }

    public class InvoiceHandlerSelector: IHandlerSelector
    {
        // ...
    }
}

Затем установите его:

var container = new WindsorContainer().Install(FromAssembly.InDirectory(new AssemblyFilter(...)));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...