如何使用依赖注入继承类?

时间:2015-04-13 08:25:20

标签: c# model-view-controller dependency-injection ninject asp.net-web-api

这里我使用DI框架(Ninject),它工作正常。但是面临的问题之一是,我有一个带有单个构造函数的基类,它接受一个接口的实现。

public class BaseApiController : ApiController
{
    readonly IAccessService _accessService; 
    public BaseApiController(IAccessService accessService)
    {
        this._accessService = accessService;
    }
}

当我从这个基类继承到具有构造函数的所有其他控制器时,这些控制器将实现它们自己的接口。我收到错误' BaseApiController'不包含带0参数的构造函数,好的,我明白了。派生类是

 public class DiscoverController  : BaseApiController
{
    readonly IDiscoverService _discoverService;
    readonly IAccessService _accessService;

    public DiscoverController(IDiscoverService discoverService,IAccessService accessService)  
    {
        _accessService = accessService;
        _discoverService = discoverService;
    }
}

如何在不修改派生类ctor的情况下执行此操作以获取类似参数并将该值传递给基本ctor,如果您建议更好的方法来处理此问题,我将不胜感激?

3 个答案:

答案 0 :(得分:6)

正如@Christian所说,错误是C#编译错误,因为你必须通过依赖。

正如您可能已经注意到的那样,拥有这样的基础课程并不是一种非常愉快的工作方式。您必须将此依赖项注入每个控制器并将其传递给基本控制器。更糟糕的是,当基本控制器需要第二个依赖项时,您必须更新控制器的所有构造函数。

你做错了就是你:

您可以在基类中使用此IAccessService来执行某些安全检查。而不是使用基类,有更好的方法。一般的解决方案是使用装饰器,但这不适用于Web API。相反,使用Web API,您可以使用DelegateHandlers并将它们添加到管道中。这样的处理程序就像装饰器一样,允许您透明地应用交叉问题,例如安全性。

答案 1 :(得分:1)

尝试修改派生构造函数,使其将参数传递给基类:

public class DiscoverController  : BaseApiController
{
   readonly IDiscoverService _discoverService;
   readonly IAccessService _accessService;

   public DiscoverController(IDiscoverService discoverService,IAccessService accessService)  : base(accessService)
   {
      _discoverService = discoverService;
   }
}

答案 2 :(得分:1)

使用:base 关键字修改DiscoverController(您将使用父构造函数): https://msdn.microsoft.com/en-us/library/hfw7t1ce.aspx