28

コンソール アプリケーションでは Log4Net を使用し、Main メソッドではロガー オブジェクトを取得しています。ここで、ILog プロパティを持ち、コンストラクター インジェクションではなくプロパティ インジェクションによって設定されることになっている BaseClass をすべてのクラスに継承させることで、このログ オブジェクトをすべてのクラスで利用できるようにしたいと考えています。

AutoFac IoC コンテナーを使用しています。ログ オブジェクトをすべてのクラスの Log プロパティに挿入する方法を教えてください。

これを達成するための最良/最も簡単な方法は何ですか?

タイプを自動的に解決する方法はありますか?

以下は私のテストアプリケーションです:

namespace ConsoleApplication1
{
    class Program
    {
        static ILog Log;
        static IContainer Container;

        static void Main(string[] args)
        {                
           InitializeLogger();

           InitializeAutoFac();

            // the below works but could it be done automatically (without specifying the name of each class)?
           Product.Log = Container.Resolve<ILog>();

           // tried below but didn't inject ILog object into the Product
           Container.Resolve<Product>();

           RunTest();

            Console.ReadLine();
        }

        private static void RunTest()
        {
            var product = new Product();
            product.Do();
        }

        private static void InitializeAutoFac()
        {
            var builder = new ContainerBuilder();

            builder.Register(c => Log).As<ILog>();

            builder.RegisterType<Product>().PropertiesAutowired();

            Container = builder.Build();            
        }

        private static void InitializeLogger()
        {
            log4net.Config.XmlConfigurator.Configure();

            Log = LogManager.GetLogger("LoggerName");
        }
    }

    public class Product
    {
        public static ILog Log { get; set; }

        public void Do()
        {
            // this throws exception because Log is not set   
            Log.Debug("some Debug");  
        }
    }
}
4

6 に答える 6

26

プロパティ インジェクションを使用します。

builder.Register(c => LogManager.GetLogger("LoggerName"))
       .As<ILog>();

builder.RegisterType<CustomClass>()
       .PropertiesAutowired();
于 2013-03-24T15:43:24.453 に答える
15

プロパティ注入は、 FieldsではなくPropertiesに対して機能します。あなたのクラスでは、 Log はプロパティではなくフィールドであるため、Autofac によって解決されることはありません。

于 2013-11-08T04:48:58.620 に答える