我有很多我想要添加日誌記錄的代碼。我的計劃是使用Unity或Castle.Windsor創建攔截日誌記錄例程,並使用自定義C#屬性將其添加到現有代碼中。我無法更改現有的代碼結構(但我可以向其添加啓動配置,因此容器註冊方法可以)。城堡攔截器不攔截
這看起來不可能在不改變調用結構的情況下(讓截獲的類需要改變實例化來使用註冊的依賴注入),所以我試着使用Castle.Windsor。這個代碼我沒有觸發攔截例程。
這給了我一些希望,這將有可能在Castle.Windsor: Inject logging dependency with 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編織將是理想的,但我不能使用它(費用和許可)。
我讀到了關於無法更改代碼結構的約束,但對於長期的代碼改進,我認爲您應該考慮圍繞幾個巧妙選擇的通用接口設計您的應用程序。這使得添加橫切關注點變得更加容易,例如稍後登錄到應用程序。看看[this](http://bit.ly/s7tGEH),[this](http://bit.ly/s3UUyv)和[this](http://bit.ly/RrJRvD )文章。 – Steven