2

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);
        }
    }

}
4

3 に答える 3

1

遅すぎるかどうかはわかりませんが、私は思う

using (IUnityContainer コンテナー = 新しい UnityContainer()) { container.RegisterType();

            container
                .RegisterType<ILogger, BasicLogger>()
                .Configure<InjectedMembers>()
                .ConfigureInjectionFor<Customer>(new InjectionConstructor(typeof(BasicLogger)));

            var customer3 = container.Resolve<Customer>();
        }
        Console.ReadLine();


public class Customer
        {
            public BasicLogger Logger { get; set; }
            public Customer(ILogger logger) 
            {
                logger.WriteToLog("creating the customer");
            }
        }

トリックを行います

于 2009-08-23T10:24:42.793 に答える
1

Unity を使用したことはありませんが、私が知っている他のすべての DI フレームワークはそれを行っており、Unity もそれを行う必要があると確信しています。

Customer コンストラクターを変更して、それが機能するかどうかを確認しましたか? それはすべきです。

于 2009-03-18T14:28:07.857 に答える
0

ジェネリックを使用

public interface ILogger<T> where T: class
{

}

public class BasicLogger:ILogger<BasicLogger>
{

}

public class AdvanceLogger:ILogger<AdvanceLogger>
{

}
于 2011-10-19T17:50:05.143 に答える