我正在尝试为我的MVC控制器注入一个依赖
private static void RegisterContainer(IUnityContainer container)
{
container
.RegisterType<IUserService, UserService>()
.RegisterType<IFacebookService, FacebookService>();
}
UserService类有一个像这样的构造函数......
public UserService(): this(new UserRepository(), new FacebookService())
{
//this a parameterless constructor... why doesnt it get picked up by unity?
}
public UserService(IUserRepository repository, IFacebookService facebook_service)
{
Repository=repository;
this.FacebookService=facebook_service;
}
我得到的例外情况如下......
目前的类型, Repositories.IUserRepository, 是一个接口,不能 建造。你错过了一个类型吗? 映射?
看起来它正在尝试将一个构造函数注入到服务中,但默认就足够了?为什么它不映射到无参数构造函数?
答案 0 :(得分:25)
Unity默认约定(在文档中非常清楚地说明)是选择具有最多参数的构造函数。你不能只是做一个简单的声明,“IoC找不到最具体的构造函数是不正确的,如果在注册类型时没有指定构造函数参数,它将自动调用默认构造函数。”每个容器实现都可以并且确实具有不同的默认值。
在Unity的情况下,就像我说的那样,它会选择参数最多的构造函数。如果有两个具有最多参数,那么它将是模棱两可的并抛出。如果你想要不同的东西,你必须配置容器来做到这一点。
您的选择是:
将[InjectionConstructor]属性放在要调用的构造函数上(不推荐,但快速简便)。
使用API:
container.RegisterType<UserService>(new InjectionConstructor());
使用XML配置:
<container>
<register type="UserService">
<constructor />
</register>
</container>
答案 1 :(得分:0)
我不能专门与Unity交谈,但IoC容器通常会尝试使用他们能找到的最具体的构造函数因为它是构造函数。
如果有一个构造函数需要两个依赖注入,那么可能它们是使用该对象所必需的;如果容器调用它,默认构造函数将必须执行某些操作。容器的工作是完成依赖,所以如果没有指示将它留给全班,为什么要让它上课呢?
根据您的代码,针对您的具体问题:
private static void RegisterContainer(IUnityContainer container)
{
container
.RegisterType<IUserService, UserService>()
.RegisterType<IFacebookService, FacebookService>();
}
IUserRepository
未注册。添加像
.RegisterType<IUserRepository, UserRepository>()