将属性复制到InterfaceInterceptor生成的代理

时间:2011-11-22 20:15:41

标签: c# unity-container reflection.emit unity-interception

假设我有一个通过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的行为,因此需要。

现在,我可以使用TransparentProxyInterceptorVirtualMethodInterceptor,它将从我的Service类继承(从而继承属性?),但InterfaceInterceptor似乎是在这种情况下使用的“右”拦截器。毕竟我在这里使用接口。

查看Unity的代码,似乎InterfaceInterceptor使用Reflection.Emit来生成代理。如果仅使用TypeBuilder.SetCustomAttributes,则可以简单地从原始类型复制属性并将其应用于其代理。但是,我无法找到Unity扩展点来执行此操作。我得到的最接近的是InterfaceInterceptorClassGenerator,但它也没有公开TypeBuilder

是否有一种简单的方法可以将InterfaceInterceptor扩展为从底层实现中复制属性?是否有另一种方法可以将ServiceBehavior上指定的Service应用于代理?

2 个答案:

答案 0 :(得分:0)

我认为你可以为你的场景添加一个新层,如下所示,

add a new layer

您可以对实现IServiceImp的“ServiceImp”进行任何拦截。服务没有任何功能代码,只有一个warpper并用作服务 ONLY 对服务进行任何拦截,Service依赖于ServiceImp(或IServiceImp,可以由Unity注入。

现在您的本地可以使用Service或ServiceImp。和WCF InstanceProvider可以使用仍具有ServiceBehavior属性的已恢复服务。

答案 1 :(得分:0)

如果您正在使用WCF,那么我不明白为什么您没有内部使用的端点。

例如,您不使用网络传输,而是使用命名管道传输。

使用另一个拦截框架(无论是Unity还是其他)的风险在于,您无法保证在拦截实施中保持奇偶校验。

也就是说,你最好只是在内部使用WCF,以及在这种情况下适合你需要的频道。

请注意,您可以编写自己的传输(可能使用共享内存或某种类型),这在同一应用程序域中进行调用时效率更高(假设您已确定传输实际上是问题)。