Ninject构造函数注入和构建问题

时间:2012-03-12 21:05:01

标签: asp.net-mvc ninject asp.net-mvc-4

继承自MVC控制器类

public class BaseController  : Controller
{

    private ITenantRepository _repository;
    [Inject]
    public BaseController(ITenantRepository repository)
    {
        _repository = repository;
    }
    protected override void Initialize(System.Web.Routing.RequestContext requestContext)
    {
        base.Initialize(requestContext);
    }
}

无法建立

BaseController'不包含带0参数的构造函数

显然我错过了一些明显的东西。

1 个答案:

答案 0 :(得分:2)

在您的子控制器中,确保您已使用与基类相同的参数定义了构造函数:

public class FooController: BaseController
{
    public FooController(ITenantRepository repository): base(repository)
    {
    }

    ...
}

您需要这样做,因为在基类中,您已删除无参数构造函数并将其替换为自定义构造函数。因此,必须从其无参数构造函数中删除派生类。

另请注意,将Ninject与ASP.NET MVC一起使用的正常方法是将其设置为应用程序顶层的DependencyResolver。控制器不应使用任何特定于容器的属性,例如您使用的[Inject]属性,因为这些属性将您的代码绑定到您正在使用的依赖注入容器。

另请注意,除了前面提到的不良做法之外,代码中构造函数的[Inject]属性没有实质性影响:

  • 没有什么可以介入并说'看,它有一个属性,我们更好地提供它的依赖'
  • 如果您确实将Ninject配置为DependencyResolver,则不需要该属性,因为构建控制器所需的内容没有任何歧义
    • 没有默认构造函数
    • 没有竞争构造函数