У меня есть много кода, к которому я хочу добавить регистрацию. Мой план состоял в том, чтобы использовать 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 было бы идеальным, но я не могу его использовать (расходы и лицензирование).
Я читал ваше ограничение о невозможности изменить структуру кода, но для долгосрочного улучшения кода, я думаю, вам стоит подумать о разработке своего приложения вокруг нескольких разумно выбранных общих интерфейсов. Это значительно облегчает добавление сквозных проблем, таких как регистрация в вашем приложении позже. Взгляните, например, на [this] (http://bit.ly/s7tGEH), [это] (http://bit.ly/s3UUyv) и [this] (http://bit.ly/RrJRvD) статья. – Steven