Unity:为单个构造函数参数指定实例并自动解析其余参数类型?

时间:2017-04-27 12:56:32

标签: constructor unity-container

我有一个接口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应如何解决IClockIPrettifyer的默认注册,这似乎过于繁琐。

有没有办法告诉Unity 覆盖构造函数的INexus参数并省略其余参数的规范?

-Sigurd Garshol

1 个答案:

答案 0 :(得分:0)

正如@tsimbalar指出的那样,之前已经提出过这个问题:

How do I use the Decorator Pattern with Unity without explicitly specifying every parameter in the InjectionConstructor

似乎简短的回答是:“你没有”。 Unity似乎只能使用一个构造函数自动解析类的构造,但是一旦开始指定单个参数,就会被指定所有参数。

在链接的答案中,OP承认,在他的情况下,使用InjectionFactory显式地new向上对象图更具可读性,并使他能够在编译时赶上构造函数参数扩展。

缺点似乎是您可能需要维护一个大型对象图,但实际上:使用new创建的每个对象都可以已解析 insetad如果需要的话。