【问题标题】:Error injecting dependency into Controller constructor将依赖项注入控制器构造函数时出错
【发布时间】: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&lt;ComicBookIssue&gt;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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 2021-09-08
    • 1970-01-01
    • 2016-08-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多