私は依存性注入の初心者です。インターフェイスインジェクションを使用して依存性注入を実装する方法を理解しましたが、依存性注入は3つの方法で実装できるか、それ以上の方法で実装できることがわかっています。
- インターフェイスインジェクション:このサービスは、消費者が実装する必要のあるインターフェイスを提供します。インターフェイスは、実行時に特定の動作を公開します。
- セッターインジェクション:依存オブジェクトは、依存関係をインジェクトするための「セッター」メソッドを公開します。
- コンストラクターの注入:依存性はクラスコンストラクターを介して注入されます
そのため、SetterインジェクションまたはUnityを使用したコンストラクターインジェクションのいずれかを使用して依存性注入を実装する方法を理解するのに役立つサンプルコードをいくつか探しています。依存性注入を実装するさまざまな方法のための小さな小さなコードの助けをいただければ幸いです。
私は団結を使ったインターフェースインジェクションしか知りません。これが、Unityを使用したインターフェイスインジェクションを使用して正常に機能する私のコードです。
public interface ILogger
{
void Write(string message);
}
We have define three classes as follows.
public class FileLogger : ILogger
{
public void Write(string message)
{
//Do somthing
}
}
public class SQLLogger : ILogger
{
public void Write(string message)
{
//Do somthing
}
}
public class WindowsEventLogger : ILogger
{
public void Write(string message)
{
//Do somthing
}
}
これらのクラスを登録し、構成ファイル(つまり、app.config)のインターフェースにマップする必要があります。
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration"/>
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<alias type="UnityTest.ILogger, UnityTest" alias="ILogger" />
<namespace name="UnityTest"/>
<container>
<register mapTo="UnityTest.FileLogger, UnityTest" name="MyFileLogger" type="ILogger"/>
<register mapTo="UnityTest.SQLLogger, UnityTest" name="MySQLLogger" type="ILogger"/>
<register mapTo="UnityTest.WindowsEventLogger, UnityTest" name="MyWindowsEventLogger" type="ILogger"/>
</container>
</unity>
注:名前属性は、レジスタタグで重要です。
最後に、このマップをコードに使用する必要があります。ですから、特定の国にとってどちらが好ましいかを知る必要があります。
次のように、ディクショナリオブジェクトを使用してこのマッピングを維持できます。
IDictionary<string, string> loggers = new Dictionary<string, string>();
loggers.Add("USA", "MyFileLogger");
loggers.Add("GBR", "MySQLLogger");
loggers.Add("IN", "MyWindowsEventLogger");
データベース、xml、または別のソースからデータを取り込むことができます。次に、Writeメソッドを呼び出します。
IUnityContainer container = new UnityContainer();
container.LoadConfiguration();
ILogger logger = container.Resolve<ILogger>(loggers[objUser.countryCode]);
logger.Write("Hello World");
新しい質問
ユニティを使用した建設注入のサンプルコードを見つけましたが、それでも1つはっきりしていません。これがコードです。
public class CustomerService
{
public CustomerService(LoggingService myServiceInstance)
{
// work with the dependent instance
myServiceInstance.WriteToLog("SomeValue");
}
}
IUnityContainer uContainer = new UnityContainer();
CustomerService myInstance = uContainer.Resolve<CustomerService>();
私たちが書くときuContainer.Resolve<CustomerService>();
、LoggingServiceクラスのインスタンスを送信していません。CustomerService
コンストラクターには。のインスタンスが必要なため、クラスのインスタンスを作成する方法を説明しますLoggingService
。
この領域は明確ではありません。それがどのように機能するかを私に説明してください。
もう1つの質問は[Dependency]
属性です。それは何をするのか、そしてメソッドをいつ属性で装飾する必要があるのか[Dependency]
です。