簡體   English   中英

如何對繼承的類使用依賴注入?

[英]How to use dependency injection for inherited class?

在這里,我使用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的方法,該如何做到這一點呢?如果您提出更好的處理方法,我將不勝感激。

就像@Christian所說的那樣,該錯誤是C#編譯器錯誤,因為您將必須傳遞依賴項。

您可能已經注意到,擁有這樣的基類並不是一種真正令人愉快的工作方式。 您將必須將此依賴項注入到每個控制器中,並將其傳遞給基本控制器。 更糟的是,當基本控制器需要第二個依賴項時,您將必須更新控制器的所有構造函數。

您做錯了什么是:

  • 使用繼承而不是組合和
  • 使用基類來應用橫切關注點(當您向該基類添加第二個橫切關注點時,這將同時違反單一職責原則開放/封閉原則 )。

您可以在基類中使用此IAccessService來進行某些安全檢查。 除了使用基類,還有更好的方法。 一個通用的解決方案是使用裝飾器,但這不適用於Web API。 相反,通過Web API,您可以使用DelegateHandlers並將它們添加到管道中。 此類處理程序的作用類似於裝飾器,並允許您透明地應用諸如安全性之類的跨領域關注點。

嘗試修改派生構造函數以使其將參數傳遞給基類:

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

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

使用:base關鍵字(您將使用父構造函數)修改DiscoverController: https : //msdn.microsoft.com/zh-cn/library/hfw7t1ce.aspx

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM