我正在使用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)请求 的AccountController建议:
1)确保您已为其定义了绑定 IAccountRepository {用户}。
2)如果在模块中定义了绑定, 确保模块已加载到内核中。
3)确保 你没有意外地创建了多个内核。
4)如果你是 使用构造函数参数,确保参数名称匹配 构造函数参数名称。
5)如果您使用自动模块 加载,确保搜索路径和过滤器正确无误。
我无法弄清楚是什么导致了一个依赖的错误,而不是另一个。两者遵循相同的模式,只需实现不同的接口。是否有其他人遇到此错误或可能发现我的实施问题?
答案 0 :(得分:0)
在我原始帖子的评论中,Remo对于相互冲突的代码是正确的。在我的项目中留下了User
模型类的冲突版本,我忘记删除了。控制器引用了这个类,而Ninject绑定到了另一个版本。删除旧版本解决了这个问题。