[英]How do I set a property on a base class for all classes that subclass it, using structuremap?
[英]How Do I Bind Different Concretes to a Property Using StructureMap
他們在我目前正在工作的IoC中使用StructureMap。
我有一個應用程序類,將實現相同接口的多個屬性...我需要綁定不同的實現
......不,我不能這樣做: IProvider<T>
例如:
public class MyApplication
{
[SetterProperty]
public IProvider OneProvider { get; set; }
[SetterProperty]
public IProvider TwoProvider { get; set; }
}
public class FooProvider: IProvider {
// I would like to force this one to bind-on OneProvider ...
}
public class BarProvider: IProvider {
// I would like to force this one to bind-on TwoProvider ...
}
例如,在Unity中,有很多方法可以做到這一點;
[Dependency("FooProvider")]
public IProvider OneProvider { get; set; }
[Dependency("BarProvider")]
public IProvider TwoProvider { get; set; }
...但是,StructureMaps SetterProperty屬性不允許這樣做。
題:
如何將不同的實現綁定到實例屬性?
樣本登記:
這是我的注冊表可能是什么樣子的一個例子......
public ContainerRegistry()
{
Scan(
scan =>
{
scan.TheCallingAssembly();
scan.WithDefaultConventions();
scan.LookForRegistries();
scan.AssembliesFromApplicationBaseDirectory(f => f.FullName.StartsWith("My.Awesome.Company", true, null));
scan.AddAllTypesOf(typeof(IApplication));
scan.AddAllTypesOf(typeof(IManager<>));
scan.AddAllTypesOf(typeof(IProvider));
scan.AddAllTypesOf(typeof(IUnitOfWorkFactory<>));
scan.SingleImplementationsOfInterface();
});
For(typeof(IApplication)).Use(typeof(MyApplication));
}
根據文檔,您可以使用Inline Setter配置
如果內聯依賴項配置為匹配該setter屬性,則下一部分中的setter策略仍可由StructureMap填充,如下例所示:
public class MyApplication : IApplication {
public IProvider OneProvider { get; set; }
public IProvider TwoProvider { get; set; }
}
public class RuleWithSettersRegistry : Registry {
public RuleWithSettersRegistry() {
//...other code removed for brevity
For<IApplication>().Use<MyApplication>()
// I would like to force FooProvider to bind-on OneProvider
.Setter(x => x.OneProvider).Is<FooProvider>()
// I would like to force BarProvider to bind-on TwoProvider
.Setter(x => x.TwoProvider).Is<BarProvider>();
}
}
如果您能夠修改實現和目標類,那么嘗試區分預期的依賴項。
public interface IFooProvider : IProvider { }
public interface IFooProvider : IProvider { }
有實現
public class MyApplication {
[SetterProperty]
public IFooProvider OneProvider { get; set; }
[SetterProperty]
public IBarProvider TwoProvider { get; set; }
}
public class FooProvider: IFooProvider { }
public class BarProvider: IBarProvider { }
這樣就可以注冊所有IProvider
派生的實現
scan.AddAllTypesOf(typeof(IProvider));
它將獲取預期的實現並綁定它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.