在多租户温莎城堡配置中丢失
本文关键字:配置 城堡 | 更新日期: 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());
}
}