[英]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.