2013-06-28 5 views
0

У меня есть много кода, к которому я хочу добавить регистрацию. Мой план состоял в том, чтобы использовать Unity или Castle.Windsor для создания перехваченной процедуры ведения журнала и добавить ее к существующему коду с помощью специального атрибута C#. Я не могу изменить существующую структуру кода (но я могу добавить в нее конфигурацию запуска, поэтому подход к регистрации контейнера в порядке).Замок Перехватчик не перехватывает

Это не представляется возможным с Unity без изменения структуры вызова (получение перехваченного класса требует изменения экземпляра для использования зарегистрированной инъекции зависимостей), поэтому я пытаюсь 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), [это] (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, хотя и почти идентичный синтаксис. Есть ли разница между Единством и Виндзором? Собственно, я нашел это, и он отвечает на мой вопрос: http://stackoverflow.com/questions/2216684/comparing-castle-windsor-unity-and-structuremap – flacnut