【问题标题】:Injecting specific implementations using Unity使用 Unity 注入特定实现
【发布时间】:2012-03-10 03:41:56
【问题描述】:

我有 2 个接口实现,我需要将第一个实现注入一个服务,将第二个实现注入另一个服务。每个服务还注入了其他没有多个实现的依赖项。

到目前为止,我有这样的事情:

public FirstService(IDataRepository dr, IOtherRepository or)
{
    this.DataRepository = dr;
    this.OtherRepository = or;
}

public SecondService(IDataRepository dr, IAnotherRepository ar)
{
    this.DataRepository = dr;
    this.OtherRepository = ar;
}

然后在我的引导程序中我有:

container.RegisterType<IDataRepository, FirstDataRepository>("First");
container.RegisterType<IDataRepository, SecondDataRepository>("Second");
container.RegisterType<IOtherRepository ,OtherRepositor>();
container.RegisterType<IAnotherRepository ,AnotherRepository>();

container.RegisterType<IFirstService, FirstService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("First")));
container.RegisterType<ISecondService, SecondService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("Second")));

当我运行我的应用程序时,我收到错误消息:“FirstService 没有采用参数的构造函数 (IDataRepository)。”

既然我专门指定了应注入的 IDataRepository 实例,是否还需要指定需要注入的 IOtherRepository 实例?还是我做错了什么?

我的实际构造函数需要 6 个参数,而仅仅因为其中一个具有多个实现而不得不手动注入每个参数会很痛苦。

【问题讨论】:

    标签: c# dependency-injection unity-container


    【解决方案1】:

    您不必指定其他参数的值,但必须指定它们的 Type,以便 Unity 可以识别要使用的构造函数。

    IFirstService 的注册将如下所示

    container.RegisterType<IFirstService, FirstService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("First"), typeof(IOtherRepository)));
    

    TecX project on codeplex 包括ClozeInjectionConstructor,用于处理您只想指定单个参数的情况。请参阅 TecX.Unity 项目中的源代码。

    顺便说一句:构造函数的 6 个参数是 constructor over injection anti-pattern 的代码异味。

    【讨论】:

      【解决方案2】:
      container.RegisterType<IFirstService, FirstService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("First"), new ResolvedParameter<IOtherRepository>()));
      container.RegisterType<ISecondService, SecondService>(new InjectionConstructor(new ResolvedParameter<IDataRepository>("Second"), new ResolvedParameter<IAnotherRepository>()));
      

      你需要解析第二个构造函数参数。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-17
        • 1970-01-01
        • 2012-05-03
        • 1970-01-01
        相关资源
        最近更新 更多