我有一个接口INexus
,用于两个不同的类。第一个类Nexus
是核心功能,另一个是“装饰类”NexusDecorator
,它接受INexus
参数,调用它,并为结果添加更多值。
public interface INexus
{
string Eval();
}
public class Nexus : INexus
{
public string Eval()
{
return "Hello World!";
}
}
public class NexusDecorator : INexus
{
private readonly INexus _nexus;
private readonly IClock _clock;
private readonly IPrettifyer _prettifyer;
public NexusDecorator(INexus nexus, IClock clock, IPrettifyer prettifyer)
{
_nexus = nexus;
_clock = clock;
_prettifyer = prettifyer;
}
public string Eval()
{
var s = _clock.Now() + ": " + _nexus.Eval();
return _prettifyer.Emphasize(s); // returns somehing like "<i>12:30: Hello World!</i>"
}
}
我使用Unity注册类型:
var container = new UnityContainer();
container.RegisterType<INexus, Nexus>("base")
container.RegisterType<INexus, NexusDecorator>(
new InjectionConstructor(
new ResolvedParameter<INexus>("base"),
new ResolvedParameter<IClock>(),
new ResolvedParameter<IPrettifyer>()
));
使用注册类型设置InjectionConstructor
,其中包含与正确序列中NexusDecorator
的构造函数匹配的实例列表。这很好,但默认注册的唯一例外是使用针对INexus
类的命名Nexus
注册。如果必须指明Unity应如何解决IClock
和IPrettifyer
的默认注册,这似乎过于繁琐。
有没有办法告诉Unity 仅覆盖构造函数的INexus
参数并省略其余参数的规范?
-Sigurd Garshol
答案 0 :(得分:0)
正如@tsimbalar指出的那样,之前已经提出过这个问题:
似乎简短的回答是:“你没有”。 Unity似乎只能使用一个构造函数自动解析类的构造,但是一旦开始指定单个参数,就会被指定所有参数。
在链接的答案中,OP承认,在他的情况下,使用InjectionFactory显式地new
向上对象图更具可读性,并使他能够在编译时赶上构造函数参数扩展。
缺点似乎是您可能需要维护一个大型对象图,但实际上:使用new
创建的每个对象都可以已解析 insetad如果需要的话。