【发布时间】:2012-03-09 08:18:39
【问题描述】:
我正在使用 Ninject 在 ASP.NET MVC 中启动一个项目来实现依赖注入。这是我目前的架构:
抽象存储库
public interface IAccountRepository<T> where T : class
{
IQueryable<T> Retrieve();
T RetrieveByID(int id);
T RetrieveByEmail(string name);
bool Create(T entity);
bool Update(T entity);
bool Delete(T entity);
}
public interface IRepository<T> where T : class
{
IQueryable<T> Retrieve();
T RetrieveByID(int id);
T RetrieveByName(string name);
bool Create(T entity);
bool Update(T entity);
bool Delete(T entity);
}
具体存储库
public class UserRepository : IAccountRepository<User>
{
// implementation omitted
}
public class ComicBookIssuesRepository
: IRepository<ComicBookIssue>
{
// implementation omitted
}
控制器
public class AccountController : Controller
{
private IAccountRepository<User> userRepository;
public AccountController(
IAccountRepository<User> repository)
{
this.userRepository = repository;
}
}
public class ComicBookIssueController : Controller
{
private IRepository<ComicBookIssue> issueRepository;
public ComicBookIssueController(
IRepository<ComicBookIssue> repository)
{
this.issueRepository = repository;
}
}
依赖注入
public class NinjectControllerFactory
: DefaultControllerFactory
{
private IKernel ninjectKernel;
public NinjectControllerFactory()
{
ninjectKernel = new StandardKernel();
AddBindings();
}
protected override IController GetControllerInstance(
RequestContext requestContext, Type controllerType)
{
return controllerType == null ? null :
(IController)ninjectKernel.Get(controllerType);
}
private void AddBindings()
{
ninjectKernel.Bind<IRepository<ComicBookIssue>>()
.To<ComicBookIssuesRepository>();
ninjectKernel.Bind<IAccountRepository<User>>()
.To<UserRepository>();
}
}
IRepository<ComicBookIssue> 到 ComicBookIssuesRepository 的绑定工作正常,因为它能够构造和注入 ComicBookIssueController 而没有错误。但是,当尝试注入AccountController 时,会抛出以下错误:
错误激活 IAccountRepository{User} 没有匹配的绑定 可用,且类型不可自绑定。激活路径:
2) 将依赖项 IAccountRepository{User} 注入参数 AccountController 类型构造函数的存储库
1) 请求 帐户控制器建议:
1) 确保您已为 IAccountRepository{用户}。
2) 如果绑定是在模块中定义的, 确保模块已加载到内核中。
3) 确保 您没有意外创建多个内核。
4) 如果你是 使用构造函数参数,确保参数名称匹配 构造函数参数名称。
5) 如果您使用的是自动模块 加载中,确保搜索路径和过滤器正确。
我无法弄清楚是什么导致了一个依赖项而不是另一个依赖项的错误。两者遵循相同的模式,只是实现不同的接口。有没有其他人遇到过这个错误或者可以发现我的实现有问题?
【问题讨论】:
-
这似乎没问题。事实上,这个问题我无法用给定的代码重现。一定有其他一些冲突的代码,或者您使用的是过时的 Ninject 版本。顺便说一句,我建议使用 Ninject.MVC3 而不是自定义控制器工厂。
-
@Remo 你对冲突的代码是正确的。我发布了我在回答这个问题时发现的内容。此外,我确实升级为使用 Ninject.MVC3 包,但只是想澄清问题与此无关。
标签: .net asp.net-mvc-3 dependency-injection ninject ioc-container