将依赖项注入Controller构造函数时出错

时间:2012-02-17 22:55:44

标签: .net asp.net-mvc-3 dependency-injection ninject ioc-container

我正在使用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)如果您使用自动模块   加载,确保搜索路径和过滤器正确无误。

我无法弄清楚是什么导致了一个依赖的错误,而不是另一个。两者遵循相同的模式,只需实现不同的接口。是否有其他人遇到此错误或可能发现我的实施问题?

1 个答案:

答案 0 :(得分:0)

在我原始帖子的评论中,Remo对于相互冲突的代码是正确的。在我的项目中留下了User模型类的冲突版本,我忘记删除了。控制器引用了这个类,而Ninject绑定到了另一个版本。删除旧版本解决了这个问题。