0

ログを追加したいコードがたくさんあります。私の計画では、Unity または Castle.Windsor を使用して傍受されたログ ルーチンを作成し、カスタム C# 属性を使用して既存のコードに追加することでした。既存のコード構造を変更することはできません (ただし、スタートアップ コンフィギュレーションを追加することはできるので、コンテナー登録のアプローチは問題ありません)。

これは呼び出し構造を変更しないと Unity では不可能に見えたので (インターセプトされたクラスを取得するには、インスタンス化を変更して登録済みの依存性注入を使用する必要がありました)、Castle.Windsor を試しています。私が持っているこのコードは、Intercept ルーチンを起動していません。

これは、Castle.Windsor で可能になるという希望を与えてくれました。Castle Windsor でロギング依存関係を注入します。

using System;
using Castle.Core;
using Castle.DynamicProxy;
using Castle.MicroKernel.Registration;
using Castle.Windsor;

namespace UnityTestProject
{
    class Program
    {
        private static WindsorContainer container;

        static void Main(string[] args)
        {
            container = new WindsorContainer();
            container.Register(Component.For<MyLogger>().LifeStyle.Transient);

            ICalcService c = new Calc();
            Console.WriteLine(c.Add(3,4));
            Console.ReadKey();
        }
    }

    public class MyLogger : IInterceptor
    {
        public void Intercept(IInvocation invocation)
        {
            Console.WriteLine("Inovaction called!");
            invocation.Proceed();
        }
    }

    public interface ICalcService
    {
        int Add(int x, int y);
    }

    public class Calc : ICalcService
    {
        [Interceptor(typeof(MyLogger))]
        public int Add(int x, int y)
        {
            return x + y;
        }
    }
}

このロギング インジェクションを行うためのより良い方法はありますか? PostSharp 製織が理想的ですが、使用できません (費用とライセンス)。

4

1 に答える 1

2

メインを に変更:

container = new WindsorContainer();
container.Register(
    Component.For<ICalcService>().ImplementedBy<Calc>().Interceptors<MyLogger>(),
    Component.For<MyLogger>().LifeStyle.Transient);

ICalcService c = container.Resolve<ICalcService>();
Console.WriteLine(c.Add(3, 4));
Console.ReadKey();

また、インターセプター属性を削除できます。ウィンザーでインターセプトを行いたい場合は、ウィンザーがコンポーネントを作成できるようにする必要があります。

于 2013-06-28T07:46:46.893 に答える