【问题标题】:Unity: Specify instance for single constructor parameter and auto-resolve remaining parameter types?Unity:为单个构造函数参数指定实例并自动解析剩余的参数类型?
【发布时间】:2017-04-27 12:56:31
【问题描述】:

我有一个接口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 的构造函数以正确的顺序匹配,使用注册的类型。这很好,但默认注册的唯一例外是使用以Nexus 类为目标的命名INexus 注册。必须指定 Unity 应该如何解决 IClockIPrettifyer 的基本默认注册似乎过于繁琐。

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

-西格德·加索尔

【问题讨论】:

标签: constructor unity-container


【解决方案1】:

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

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

似乎简短的回答是:“你没有”。似乎 Unity 能够仅使用一个构造函数自动解析类的构造,但是一旦您开始指定单个参数,您就无法全部指定它们。

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-25
    • 1970-01-01
    • 2013-06-08
    • 1970-01-01
    • 1970-01-01
    • 2020-06-09
    相关资源
    最近更新 更多