У меня есть небольшая проблема. Я работаю в замке Виндзор Контейнер МОК. Теперь то, что я хотел сделать, - просто позабавиться с некоторыми принципами АОП, и то, что я конкретно хочу сделать, основано на имени метода и выполнить некоторую регистрацию. Я смотрел на Interceptors, и в настоящее время я использую интерфейс IInterceptor, реализованный как класс, для выполнения этой регистрации с использованием аспектов. Проблема в том, что если я хочу выполнить запись в журнал для конкретного метода, то он становится беспорядочным, так как мне нужно вставить некоторую логику в мой реализованный аспект, чтобы проверить имя метода и т. Д. *
Я прочитал, что вы можете делать все это, используя Dynamic Proxies и интерфейс IInterceptorSelector и интерфейс IProxyGenerationHook. Я видел несколько примеров того, как это делается в сети, но я совершенно запутался, как все это помещается в контейнер Windsor. Я имею в виду, что я использую контейнер windsor, который в моем коде фактически ссылается на интерфейс IWindsorContainer для создания всех моих объектов. Все мои настройки сделаны в коде, а не в XML.
Во-первых, кто-нибудь знает способ выполнения АОП для конкретного метода в контейнере Виндзор, кроме того, как я это делаю в настоящее время.
Во-вторых, как мне использовать Dynamic Proxy в контейнере Windsor?
Ниже я добавил код, где я создаю свой прокси и регистрирую свой класс с
перехватчики
ProxyGenerator _generator = new ProxyGenerator(new PersistentProxyBuilder());
IInterceptorSelector _selector = new CheckLoggingSelector();
var loggingAspect = new LoggingAspect();
var options = new ProxyGenerationOptions(new LoggingProxyGenerationHook())
{ Selector = _selector };
var proxy = _generator.CreateClassProxy(typeof(TestClass), options, loggingAspect);
TestClass testProxy = proxy as TestClass;
windsorContainer.Register(
Component.For<LoggingAspect>(),
Component.For<CheckLoggingAspect>(),
Component.For<ExceptionCatchAspect>(),
Component.For<ITestClass>()
.ImplementedBy<TestClass>()
.Named("ATestClass")
.Parameters(Parameter.ForKey("Name").Eq("Testing"))
.Proxy.MixIns(testProxy));
Тестовый класс ниже:
public class TestClass : ITestClass
{
public TestClass()
{
}
public string Name
{
get;
set;
}
public void Checkin()
{
Name = "Checked In";
}
}
Что касается перехватчиков, они очень просты и просто вводят метод, если имя начинается с Check.
Теперь, когда я определяю свой TestClass из контейнера, я получаю ошибку.
{"Это ошибка DynamicProxy2: тип Mixin TestClassProxy реализует IProxyTargetAccessor, который является интерфейсом инфраструктуры DynamicProxy, и вы никогда не должны реализовывать его самостоятельно. Вы пытаетесь смешивать в существующем прокси?"}
Я знаю, что я использую прокси неправильно, но поскольку я не видел никакого конкретного примера того, как использовать прокси с контейнером виндзор, это немного сбивает с толку.
Я имею в виду, если я хочу использовать LoggingProxyGenerationHook, который просто говорит перехватчикам сначала для методов, начинающихся со слова «проверка», то это правильный способ сделать это или я полностью на неверном пути. Я просто пошел по прокси-серверу, так как он кажется очень мощным, и я хотел бы понять, как использовать эти прокси-серверы для будущих попыток программирования.