c# - 将属性复制到接口(interface)拦截器生成的代理

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

假设我有一个通过 WCF 公开的接口(interface):

[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 似乎是在这种情况下使用的“正确”拦截器。毕竟,我在这里使用接口(interface)。

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

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

最佳答案

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

add a new layer

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

现在您的本地可以使用 Service 或 ServiceImp。并且 WCF InstanceProvider 可以使用仍然具有 ServiceBehavior 属性的 resovled Service。

关于c# - 将属性复制到接口(interface)拦截器生成的代理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8233202/

相关文章:

c# - 字典不存储值

c# - Scintilla 编辑器多语法高亮显示

c# - 如何在 ASP.NET 中使用 IoC 容器配置单元测试?

unity-container - 统一错误 : The given assembly name or codebase was invalid

c# - WPF 简单绑定(bind)

c# - 覆盖等于运算符

c# - 如何使用 Unity 一次注入(inject)两个实现?

c# - IL Emit 调用委托(delegate)实例?

c# - 反射生成的类型和泛型

c# - 使用 Reflection.Emit 生成相互引用的类型