2012-03-09 53 views
3

我有一个接口的实现,我需要将第一个实现注入到一个服务中,将第二个实现注入到另一个服务中。每个服务也被注入了没有多个实现的其他依赖。使用Unity注入特定实现

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

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个参数,并且仅仅因为其中一个具有多个实现而必须手动注入每个参数会很痛苦。

回答

3

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

IFirstService登记会再看看这样

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

TecX project on codeplex包括与这样的情况下,您只需要指定一个参数交易的ClozeInjectionConstructor。请参阅TecX.Unity项目中的源代码。

btw:构造函数的6个参数是constructor over injection anti-pattern的代码气味。

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

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