这是一个很晚的回复,但问题仍然出现在Google中。
所以5年后...
我有一个非常简单的方法。通常,当您需要使用“命名依赖项”时,这是因为您正在尝试实现某种策略模式。在那种情况下,我只是在Unity和我的其余代码之间创建了一个间接级别,StrategyResolver
即不直接依赖Unity。
public class StrategyResolver : IStrategyResolver
{
private IUnityContainer container;
public StrategyResolver(IUnityContainer unityContainer)
{
this.container = unityContainer;
}
public T Resolve<T>(string namedStrategy)
{
return this.container.Resolve<T>(namedStrategy);
}
}
用法:
public class SomeClass: ISomeInterface
{
private IStrategyResolver strategyResolver;
public SomeClass(IStrategyResolver stratResolver)
{
this.strategyResolver = stratResolver;
}
public void Process(SomeDto dto)
{
IActionHandler actionHanlder = this.strategyResolver.Resolve<IActionHandler>(dto.SomeProperty);
actionHanlder.Handle(dto);
}
}
注册:
container.RegisterType<IActionHandler, ActionOne>("One");
container.RegisterType<IActionHandler, ActionTwo>("Two");
container.RegisterType<IStrategyResolver, StrategyResolver>();
container.RegisterType<ISomeInterface, SomeClass>();
现在,这样做的好处是,将来在添加新策略时,我将不再需要再次接触StrategyResolver。
非常简单 非常干净,我将对Unity的依赖程度降至最低。我唯一接触过StrategyResolver的地方是,如果我决定更改不太可能发生的容器技术。
希望这可以帮助!
编辑:我真的不喜欢被接受的答案,因为当您Dependency
在服务的构造函数中使用该属性时,您实际上对Unity具有硬依赖性。该Dependency
属性是Unity库的一部分。到那时,您还可以IUnityContainer
随处传递一个依赖项。
我更喜欢让我的服务类依赖于我完全拥有的对象,而不是到处都依赖于外部库。另外,使用Dependency
属性会使构造函数的签名更加简洁明了。
此外,该技术允许在运行时解析命名依赖关系,而不必在构造函数中,应用程序配置文件中或使用中对命名依赖关系进行硬编码,InjectionParameter
所有这些方法都需要知道在设计时使用哪种命名依赖关系。
编辑(2016-09-19):对于那些可能会想知道的人IUnityContainer
,如StrategyResolver
构造函数签名所示,当您请求作为依赖项时,容器将知道自己进行传递。
编辑(2018-10-20):这是另一种方法,只需使用工厂即可:
public class SomeStrategyFactory : ISomeStrategyFactory
{
private IStrategy _stratA;
private IStrategy _stratB;
public SomeFactory(IStrategyA stratA, IStrategyB stratB)
{
_stratA = stratA;
_stratB = stratB;
}
public IStrategy GetStrategy(string namedStrategy){
if (namedStrategy == "A") return _stratA;
if (namedStrategy == "B") return _stratB;
}
}
public interface IStrategy {
void Execute();
}
public interface IStrategyA : IStrategy {}
public interface IStrategyB : IStrategy {}
public class StrategyA : IStrategyA {
public void Execute(){}
}
public class StrategyB : IStrategyB {
public void Execute() {}
}
用法:
public class SomeClass : ISomeClass
{
public SomeClass(ISomeStrategyFactory strategyFactory){
IStrategy strat = strategyFactory.GetStrategy("HelloStrategy");
strat.Execute();
}
}
注册:
container.RegisterType<ISomeStrategyFactory, SomeStrategyFactory>();
container.RegisterType<IStrategyA, StrategyA>();
container.RegisterType<IStrategyB, StrategyB>();
container.RegisterType<ISomeClass, SomeClass>();
第二个建议是相同的,但使用工厂设计模式。
希望这可以帮助!
IRepository>("Customer")
应该在另一个实例注入ClientModel