Копирование атрибутов в сгенерированный прокси InterfaceInterceptor

Предположим, у меня есть интерфейс через WCF:

[ServiceContract]
interface IService
{
    [OperationContract]
    void Foo();
}

И реализация:

[ServiceBehavior(...)]
class Service : IService
{
    public void Foo() { /* impl */ }
}

Я могу опубликовать Service над WCF и все работает хорошо.

Теперь я хочу использовать Unity для перехвата Service, Я могу использовать поведение WCF для этого, но IService (а также Service который реализует его) иногда доступны из внутренних служб, а не через WCF, и я хочу механизм перехвата, который будет применяться как при обращении к классу через WCF, так и при локальном доступе.

Я могу использовать Unity's InterfaceInterceptor для этого, но тогда прокси, который я получу, не будет иметь ServiceBehavior атрибут, который явно влияет на поведение WCF и поэтому необходим.

Теперь я могу использовать TransparentProxyInterceptor или же VirtualMethodInterceptor, который унаследует от моего Service класс (и, следовательно, наследовать атрибуты?), но InterfaceInterceptor кажется, что "правильный" перехватчик использовать в этом случае. Я работаю с интерфейсами здесь, в конце концов.

Глядя на код Unity, кажется, что InterfaceInterceptor использования Reflection.Emit сгенерировать прокси. Если бы только он использовал TypeBuilder.SetCustomAttributes, он может просто скопировать атрибуты из моего оригинального типа и применить их к своему прокси. Однако я не смог найти точку расширения Unity для этого. Самым близким был InterfaceInterceptorClassGenerator, но это тоже не разоблачает его TypeBuilder,

Есть ли простой способ продлить InterfaceInterceptor скопировать атрибуты из базовой реализации? Есть ли другой способ получить ServiceBehavior указано на Service подать заявку на прокси?

2 ответа

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

Например, вместо использования сетевого транспорта вы бы использовали транспорт с именованным каналом.

Риск при использовании другой инфраструктуры перехвата (будь то Unity или другой) заключается в том, что вам не гарантируется, что вы поддерживаете паритет в реализациях перехвата.

Тем не менее, вам лучше просто использовать WCF для внутреннего использования вместе с каналом, который соответствует вашим потребностям в этом сценарии.

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

Я думаю, что вы можете добавить новый слой для вашего сценария следующим образом,

добавить новый слой

Вы можете сделать любой перехват для ServiceImp, который реализует IServiceImp. Сервис не имеет какого-либо кода функции, но является только деформатором и используется ТОЛЬКО как Сервис. НЕ перехватывайте Сервис, Сервис зависит от ServiceImp(или IServiceImp, который может быть введен Unity).

Теперь ваш местный житель может использовать Service или ServiceImp. и WCF InstanceProvider может использовать обновленную службу, которая все еще имеет атрибут ServiceBehavior.

Другие вопросы по тегам