使用Unity注入特定实现

时间:2012-03-09 18:56:23

标签: c# dependency-injection unity-container

我有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)。”

我是否还需要指定需要注入的IOtherRepository实例,因为我具体指定了应该注入的IDataRepository实例?或者我做错了什么?

我的实际构造函数需要6个参数,因为其中一个有多个实现,所以必须手动注入每个参数会很麻烦。

2 个答案:

答案 0 :(得分:3)

您不必指定其他参数的值,但必须指定其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的代码味道。

答案 1 :(得分:0)

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>()));

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