我有两个接口实现,我需要将第一个实现注入到一个服务中,并将第二个实现注入到另一个服务中。每个服务还注入了没有多个实现的其他依赖项。
到目前为止,我有这样的东西:
public FirstService(IDataRepository dr, IOtherRepository or)
{
    this.DataRepository = dr;
    this.OtherRepository = or;
}
public SecondService(IDataRepository dr, IAnotherRepository ar)
{
    this.DataRepository = dr;
    this.OtherRepository = ar;
}然后在我的bootstrapper中有:
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个参数,仅仅因为其中一个有多个实现,就必须手动注入每个参数,这将是一件痛苦的事情。
发布于 2012-03-10 03:34:48
您不必指定其他参数的值,但必须指定它们的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的代码气味。
发布于 2012-03-10 03:41:56
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>()));您需要解析第二个构造函数参数。
https://stackoverflow.com/questions/9639470
复制相似问题