假设我有一个通过WCF公开的接口:
[ServiceContract]
interface IService
{
[OperationContract]
void Foo();
}
实施:
[ServiceBehavior(...)]
class Service : IService
{
public void Foo() { /* impl */ }
}
我可以在WCF上发布Service
,一切正常。
现在,我想使用Unity来执行Service
的拦截。我可以为此使用WCF行为,但IService
(以及实现它的Service
有时会被内部服务访问,而不是通过WCF访问,我想要一个拦截机制,当类是通过WCF访问以及何时在本地访问。
我可以使用Unity的InterfaceInterceptor
,但是我获得的代理将没有ServiceBehavior
属性,这显然会影响WCF的行为,因此需要。
现在,我可以使用TransparentProxyInterceptor
或VirtualMethodInterceptor
,它将从我的Service
类继承(从而继承属性?),但InterfaceInterceptor
似乎是在这种情况下使用的“右”拦截器。毕竟我在这里使用接口。
查看Unity的代码,似乎InterfaceInterceptor
使用Reflection.Emit
来生成代理。如果仅使用TypeBuilder.SetCustomAttributes
,则可以简单地从原始类型复制属性并将其应用于其代理。但是,我无法找到Unity扩展点来执行此操作。我得到的最接近的是InterfaceInterceptorClassGenerator
,但它也没有公开TypeBuilder
。
是否有一种简单的方法可以将InterfaceInterceptor
扩展为从底层实现中复制属性?是否有另一种方法可以将ServiceBehavior
上指定的Service
应用于代理?
答案 0 :(得分:0)
我认为你可以为你的场景添加一个新层,如下所示,
您可以对实现IServiceImp的“ServiceImp”进行任何拦截。服务没有任何功能代码,只有一个warpper并用作服务 ONLY ,不对服务进行任何拦截,Service依赖于ServiceImp(或IServiceImp,可以由Unity注入。
现在您的本地可以使用Service或ServiceImp。和WCF InstanceProvider可以使用仍具有ServiceBehavior属性的已恢复服务。
答案 1 :(得分:0)
如果您正在使用WCF,那么我不明白为什么您没有内部使用的端点。
例如,您不使用网络传输,而是使用命名管道传输。
使用另一个拦截框架(无论是Unity还是其他)的风险在于,您无法保证在拦截实施中保持奇偶校验。
也就是说,你最好只是在内部使用WCF,以及在这种情况下适合你需要的频道。
请注意,您可以编写自己的传输(可能使用共享内存或某种类型),这在同一应用程序域中进行调用时效率更高(假设您已确定传输实际上是问题)。