2

Я ищу информацию об использовании и настройке виндзора для предоставления динамического прокси для перехвата вызовов в экземпляр другого класса.Использование DynamicProxy в качестве шаблона декоратора в контейнере виндзора

Мой класс представляет ресурс, который должен сохраняться в качестве долговечного экземпляра контейнером по соображениям производительности. Однако иногда этот ресурс может переходить в непостижимое состояние и требует обновления. Я бы хотел, чтобы контейнер обрабатывал это, поэтому код клиента не нужен. Я могу создать свою собственную фабрику, чтобы сделать это, я хотел бы знать, есть ли какая-то холодная регистрация в Windsor, чтобы сделать это для меня, поэтому мне не нужно создавать отдельный заводский класс :)

Вот несколько псевдокодов чтобы продемонстрировать эту проблему:

public interface IVeryImportantResource 
{ 
    void SomeOperation(); 
} 

public class RealResource : IVeryImportantResource 
{ 
    public bool Corrupt { get; set; } 

    public void SomeOperation() 
    { 
     //do some real implementation 
    } 
} 

public class RealResourceInterceptor : IInterceptor 
{ 
    private readonly IKernel kernel; 

    public RealResourceInterceptor(IKernel Kernel) 
    { 
     kernel = Kernel; 
    } 

    public void Intercept(IInvocation invocation) 
    { 
     RealResource resource = invocation.InvocationTarget as RealResource; 

     if(resource.Corrupt) 
     { 
      //tidy up this instance, as it is corrupt 
      kernel.ReleaseComponent(resource); 
      RealResource newResource = kernel.Resolve<RealResource>(); //get a new one 
      //now what i would like to happen is something like this 
      //but this property has no setter, so this doesn't work 
      //also, i would like to know how to register RealResourceInterceptor as well RealResourceInterceptor 
      invocation.InvocationTarget = newResource; 
     } 
     invocation.Proceed(); 
    } 
} 

Любые идеи, как реализовать что-то вроде моего класса RealResourceInterceptor, а также как настроить контейнер использовать его? Благодаря!

ответ

2

Этот вопрос скорее касается обновления синглтонного компонента, чем перехвата. Проблема обновления синглетонов дается в this question.

Нижняя линия: это не так просто, как кажется, есть много ловушек с этим подходом.

Может быть, проблема заключается в этом компоненте поврежденного (почему это происходит?)

+1

Использование замка объекта путь вперед –

0

Моего объекта является WCF прокси. Эти объекты перейдут в состояние с ошибкой, что делает их непригодными для использования. Я не могу контролировать, когда или если они перейдут. Я могу только обнаружить, что это произошло, и воссоздать новый прокси.

Спасибо за ссылку, раздел цитируется ниже описывает примерно, как я сейчас делаю это:

В качестве альтернативы другого подхода к есть декоратор для вашей службы зарегистрирован в контейнере с одноплодной жизни , но ваш фактический базовый сервис, зарегистрированный в контейнере с переходным стилем жизни - , тогда, когда вам нужно обновить компонент , просто утилизируйте переходный компонент , принадлежащий декоратора и заменить его на недавно разрешенный экземпляре (разрешить его с помощью ключевых компонентов, а затем службу, чтобы избежать попаданий декоратора) - это позволит избежать проблемы с другими одноэлементными услугами (которые не являются быть «обновилась») от держась устаревшие услуги, которые были утилизированы что делает их непригодными для использования, но требует немного литья и т.д., чтобы заставить его работать

Мой вопрос, вместо того, чтобы любой из них :

1) используя статически типизированный декоратор, чтобы обернуть мой RealResource (как указано выше). Как только вы получаете несколько этих прокси, становится боль, когда нужно создавать декораторы для всех.

2) использование фабричного объекта, который создает динамический прокси-сервер для управления состоянием любого прокси-сервера WCF.

2) безусловно супер, но, похоже, что-то Виндзор может уже сделать для меня. Итак, я хотел бы знать, есть ли какой-либо контейнерный автомат, который позволит мне зарегистрировать перехватчик во время конфигурации вместо создания моей собственной фабрики?

Что-то вроде этого псевдокода:

container.AddComponent("dynamicProxyWrapper", typeof(IRealResource), typeof(RealResource)).UsingInterceptor(typeof(RealResourceInterceptor)); 
+0

Вы пробовали объект WCF? http://www.castleproject.org/container/facilities/trunk/wcf/index.html –

Смежные вопросы