【问题标题】:Unity - how to use multiple mappings for the same type and inject into an objectUnity - 如何为同一类型使用多个映射并注入对象
【发布时间】:2011-03-26 07:06:30
【问题描述】:

我正在使用 Unity 2.0,在下面的代码中,我试图在 Worker 对象中注入一个特定的工具。

我想使用以下代码。但是当然有一个错误“依赖关系的解决失败”。我相信我应该能够做这样的事情,但我很难弄清楚。

IUnityContainer container = new UnityContainer();
container.RegisterType<IWorker, Worker>("Worker")
    .RegisterType<ITool, ToolA>("ToolA")
    .RegisterType<ITool, ToolB>("ToolB")
    .RegisterType<ITool, ToolC>("ToolC");

IWorker worker = container.Resolve<Worker>("ToolA");

我知道这不起作用,但我该如何解决这个问题?

BarDev

【问题讨论】:

    标签: c# dependency-injection unity-container ioc-container unity2.0


    【解决方案1】:

    有两种方法可以实现:

    您可以使用ParameterOverride 和两步解决过程...

    var tool = container.Resolve<ITool>("ToolB");
    var worker = container.Resolve<IWorker>("Worker", 
        new ParameterOverride("tool", tool));
    

    ...假设接收IToolWorker 上的构造函数参数称为“工具”(可以将多个ParameterOverride 实例传递给Resolve)。 IWorker 的命名实例所具有的任何其他依赖项(通过构造函数或属性注入)也应正确解析。

    另外,为什么不设置需要指定 ITool 的名为 WorkerA, WorkerB, WorkerC 的实例...

    container.RegisterType<ITool, ToolA>("ToolA");
    container.RegisterType<ITool, ToolB>("ToolB");
    container.RegisterType<ITool, ToolC>("ToolC");
    container.RegisterType<IWorker, Worker>("WorkerA", 
        new InjectionConstructor(new ResolvedParameter<ITool>("ToolA")));
    container.RegisterType<IWorker, Worker>("WorkerB", 
        new InjectionConstructor(new ResolvedParameter<ITool>("ToolB")));
    container.RegisterType<IWorker, Worker>("WorkerC", 
        new InjectionConstructor(new ResolvedParameter<ITool>("ToolC")));
    

    我认为后一种方法的缺点是,如果Worker 采用额外的构造函数参数,您还需要将它们指定给InjectionConstructor,指定顺序与您期望 Unity 使用的构造函数相同。 ..

    container.RegisterType<IWorker, Worker>("WorkerA", 
        new InjectionConstructor(typeof(SomeDependency), new ResolvedParameter<ITool>("ToolA"), typeof(SomeOtherDependency));
    

    不过,Unity 会在上面的示例中查找 SomeDependencySomeOtherDependency 的未命名实例,这样可以为您节省一些工作。

    【讨论】:

    • 汗,这太棒了。这是我所缺少的拼图。现在一切都在一起了。
    • 出于兴趣,哪种方法最适合您?在我正在工作的一个项目中,我发现这两种方法实际上都有用。
    • 第二个选项对我有很大帮助。我正在处理的应用程序从与接口匹配的动态加载程序集中查找类。我为工具创建注册,然后为工作人员创建注册并为工作人员指定工具。它的 1 对 1 映射。我还有其他构造参数要传递给这两个对象。我还能够为 AOP 任务实现策略注入。这对我有很大帮助。
    猜你喜欢
    • 1970-01-01
    • 2022-01-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-28
    • 2019-12-20
    • 2012-08-18
    相关资源
    最近更新 更多