Копирование атрибутов в сгенерированный прокси 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.