2

假设我有一个通过 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 InterfaceInterceptor,但是我得到的代理将没有该ServiceBehavior属性,这显然会影响 WCF 行为,因此是需要的。

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

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

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

4

2 回答 2

0

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

添加一个新层

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

现在您的本地可以使用 Service 或 ServiceImp。并且 WCF InstanceProvider 可以使用仍具有 ServiceBehavior 属性的已解析服务。

于 2011-11-23T02:57:40.847 回答
0

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

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

使用另一个拦截框架(无论是 Unity 还是其他)的风险在于,您无法保证在拦截实现中保持对等性。

也就是说,您最好还是在内部使用 WCF,以及在该场景中满足您需求的通道。

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

于 2011-11-23T03:04:47.563 回答