2013-06-28 66 views
0

我有很多我想要添加日誌記錄的代碼。我的計劃是使用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編織將是理想的,但我不能使用它(費用和許可)。

+0

我讀到了關於無法更改代碼結構的約束,但對於長期的代碼改進,我認爲您應該考慮圍繞幾個巧妙選擇的通用接口設計您的應用程序。這使得添加橫切關注點變得更加容易,例如稍後登錄到應用程序。看看[this](http://bit.ly/s7tGEH),[this](http://bit.ly/s3UUyv)和[this](http://bit.ly/RrJRvD )文章。 – Steven

回答

1

改變主要以:

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

而且你可以刪除攔截器的屬性。如果你想用windsor進行攔截,那麼必須允許Windsor創建組件。

+0

是的,這個'container.Resolve ()'是我希望不需要做的,但從長遠來看,我可以看到它更好。我只需要讓我的團隊的其他成員加入進來。現在看來,這幾乎看起來像Unity,幾乎相同的語法。 Unity和Windsor有很大區別嗎?其實,我發現這一點,它回答了我的問題:http://stackoverflow.com/questions/2216684/comparing-castle-windsor-unity-and-structuremap – flacnut