在多租户温莎城堡配置中丢失

本文关键字:配置 城堡 | 更新日期: 2023-09-27 17:59:13

我将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());

在多租户温莎城堡配置中丢失

使用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(...)));

好的,我找到了一个解决方案:

container.Register(Component.For<IFrmInvoice>().ImplementedBy<IFrmInvoice>());

好的,现在我明白了。。我们是这样注册的:

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());
    }
}