Unityのドキュメントには次のように記載されています。
開発者がUnityコンテナのResolveメソッドを使用してインスタンス化するクラスに、他のクラスへの1つ以上の依存関係を定義するコンストラクターがある場合、Unityコンテナーは、コンストラクターのパラメーターで指定された依存オブジェクトインスタンスを自動的に作成します。
これは素晴らしいことですが、ほとんどの場合、物事を切り離しておくために、インジェクション用のクラスではなくインターフェイスを指定します。
では、クラスインジェクションの代わりにインターフェイスインジェクションを指定するクラスを.Resolve <>するときに、Unityの自動インジェクションをどのように利用できますか?
つまり、次のコードで、Customerコンストラクターを「 publicCustomer(ILoggerlogger) 」に変更したときにどのように機能させることができますか?
using System;
using Microsoft.Practices.Unity;
namespace TestUnityInjection23
{
public class Program
{
static void Main(string[] args)
{
Customer customer1 = new Customer(new BasicLogger());
//Customer customer2 = new Customer(new AdvancedLogger()); //can't use this since Customer only accepts BasicLogger
UnityContainer container = new UnityContainer();
container.RegisterType<Customer>();
container.RegisterType<ILogger, BasicLogger>();
Customer customer3 = container.Resolve<Customer>();
Console.ReadLine();
}
}
public class Customer
{
public Customer(BasicLogger logger) //would like to have Customer depend on ILogger here so logger can be swapped out
{
logger.WriteToLog("creating the customer");
}
}
public interface ILogger
{
void WriteToLog(string text);
}
public class BasicLogger : ILogger
{
public void WriteToLog(string text)
{
Console.WriteLine(text);
}
}
public class AdvancedLogger : ILogger
{
public void WriteToLog(string text)
{
Console.WriteLine("*** {0} ***", text);
}
}
}