Замок Dynamic Proxy в Виндзорском Контейнере - PullRequest
1 голос
/ 24 февраля 2010

У меня есть небольшая проблема. Я работаю в замке Виндзор Контейнер МОК. Теперь то, что я хотел сделать, - просто позабавиться с некоторыми принципами АОП, и то, что я конкретно хочу сделать, основано на имени метода и выполнить некоторую регистрацию. Я смотрел на 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, который просто говорит перехватчикам сначала для методов, начинающихся со слова «проверка», то это правильный способ сделать это или я полностью на неверном пути. Я просто пошел по прокси-серверу, так как он кажется очень мощным, и я хотел бы понять, как использовать эти прокси-серверы для будущих попыток программирования.

1 Ответ

3 голосов
/ 24 февраля 2010

Используя .Interceptors(), вы уже используете динамический прокси. Когда компонент определил перехватчики, Windsor создаст для него прокси и использует эти перехватчики. Вы также можете использовать метод .SelectedWith и .Proxy свойство для установки других параметров, которые вы уже знаете из DynamicProxy.

Я только что добавил сайт о Windsor AOP в документацию вики . Там еще немногое, но я (и Маурисио;)) предоставлю всю необходимую вам информацию. Посмотрите, и дайте нам знать, если все ясно и если чего-то не хватает.

...