簡體   English   中英

如何正確使用依賴注入?

[英]How do I properly use Dependency Injection?

簡單案例:我有一個用於記錄消息的接口,如下所示:

public interface ILogger
{
   void Log(string message);
}

也許有三個不同的類實現了這個接口。

現在,我可以在一個地方寫一行,換行,比如:

kernel.Bind<ILogger>().To<ConsoleLogger>();

我的問題是,如何在許多類中使用該接口,但不通過構造函數注入每個人。 因為我們可以使用這么多不同的接口,並且該類構造函數的聲明可能很混亂。

在構造函數中有太多注入的項目是代碼味道。 這通常意味着您的班級不僅僅扮演一個角色。 單一責任原則說每個類應該只有一個目的,完全封裝在類中。

在依賴注入中,在遺留場景之外使用屬性注入被認為是不良形式。 通過屬性注入值表明它是可選的,因此不是真正的依賴。

如果您的類型具有大量的構造函數依賴性,那么可能表明您需要進行一些重構。 也許某些類型一起使用,可以重構為自己的組件。 無論哪種方式,如果您使用的是像Ninject這樣的IoC框架,那么類型需要多少構造函數參數才真正重要? 無論如何,容器都會為您注射。

雖然@LukeMcGregor說它一般都是真的,但Logger看起來像是一個跨領域的問題,如果你不想用ILogger污染每個構造函數,也可以通過AOP解決。 Ninject似乎通過ninject.extensions.interception支持AOP。

您可以實現ILogger Logger { get; set;} 在類中ILogger Logger { get; set;}屬性並使用大多數IoC容器支持的屬性注入功能。

暫無
暫無

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

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