我试图在Unity中设置注册,但我无法完全满足我的需求。
想象一下,我有以下定义:
public interface ISomeInterface { ... }
public interface ISomeDependency { ... }
public class DependencyA : ISomeDependency { ... }
public class DependencyB : ISomeDependency { ... }
public class SomeClassA : ISomeInterface
{
public SomeClassA(ISomeDependency dep){ ... }
}
public class SomeClassB : ISomeInterface
{
public SomeClassB(ISomeDependency dep){ ... }
}
然后我按照以下方式在Unity中注册它们:
Container.RegisterType<ISomeDependency, DependencyA>("DependencyA");
Container.RegisterType<ISomeDependency, DependencyB>("DependencyB");
Container.RegisterType<ISomeInterface, SomeClassA>("ClassA");
Container.RegisterType<ISomeInterface, SomeClassB>("ClassB");
我还注册了一个基于密钥构建ISomeInterface
的工厂。
Container.RegisterType<Func<string, ISomeInterface>(new InjectionFactory(c=>
{
return new Func<string, ISomeInterface>(x=>
{
return c.Resolve<ISomeInterface>(x)
}
}));
(顺便说一句,如果有人知道更好的创建关键工厂的方法,我欢迎提示)
如何配置Unity,以便当Unity构建SomeClassA的实例时,它还会注入DependencyA的实例?当Unity为我构建SomeClassB的实例时,它将注入一个DependencyB实例。
感谢您的帮助。
编辑:更正了我的拼写错误
答案 0 :(得分:1)
如果为一个界面注册两种具体类型,Unity将不知道要解析哪一种。您必须提供更多信息。一种方法是使用参数覆盖。
// Override the constructor parameter "dep" value
// Use DependencyA instead of other value
var result = container.Resolve<ISomeInterface>(
new ParameterOverride("dep", new DependencyA())
.OnType<SomeClassA>());
但是,您还注册了机器人SomeClassA
和SomeClassB
作为ISomeInteface
的类型,因此您还必须告诉Unity其中一个实施方案想要ISomeInterface
时想要。