c# – Unity:将两个接口注册为一个带有拦截的单例

我有一个实现两个接口的类,我想对类的方法应用拦截.

我正在遵循Unity Register two interfaces as one singleton的建议,但我对结果感到惊讶.简而言之,似乎我的CallHandler被调用了两次.我有一个最简单的例子是:

public interface I1
{
    void Method1();
}

public interface I2
{
    void Method2();
}

public class C : I1,I2
{
    [Log]
    public void Method1() {}

    public void Method2() {}
}

public class LogAttribute : HandlerAttribute
{
    public override ICallHandler CreateHandler(IUnityContainer container)
    {
        return new LogCallHandler();
    }
}

public class LogCallHandler : ICallHandler
{
    public IMethodReturn Invoke(
        IMethodInvocation input,GetNextHandlerDelegate getNext)
    {
        Console.WriteLine("Entering " + input.MethodBase.Name);
        var methodReturn = getNext().Invoke(input,getNext);
        Console.WriteLine("Leaving " + input.MethodBase.Name);
        return methodReturn;
    }

    public int Order { get; set; }
} 

void Test()
{
    IUnityContainer container = new UnityContainer();
    container.AddNewExtension<Interception>();
    container.RegisterType<C>(new ContainerControlledLifetimeManager());

    container.RegisterType<I1,C>(
        new Interceptor<TransparentProxyInterceptor>(),new InterceptionBehavior<PolicyInjectionBehavior>());

    container.RegisterType<I2,new InterceptionBehavior<PolicyInjectionBehavior>());

    container.Resolve<I1>().Method1();
}

这给出了这个输出:

Entering Method1
Entering Method1
Leaving Method1
Leaving Method1

删除“container.RegisterType I2,C”行使日志只出现一次.添加第三个接口I3(类似于I2)会导致日志出现三次.

我原本希望只调用一次Log.我可以通过让LogCallHandler检测它是否从另一个LogCallHandler调用来实现这一点,但这看起来不太优雅.

最初我想将拦截行为应用于C而不是分别应用于I1和I2,但这需要C继承MarshalByRefObject,这是我不愿意强加的约束.

还有另一种方法吗?

解决方法

问题是您正在将透明代理应用于每个接口.相反,如果将它应用于具体类,则只能获得一个代理.此外,除非您希望共享实例,否则不需要将其设为单例.

我在测试控制台项目中运行了此配置并获得了所需的结果.感谢您提供隔离问题的工作代码段!

var container = new UnityContainer()
    .AddNewExtension<Interception>()
    .RegisterType<I1,C>()
    .RegisterType<I2,C>()
    .RegisterType<C>(
        new ContainerControlledLifetimeManager(),new Interceptor<TransparentProxyInterceptor>(),new InterceptionBehavior<PolicyInjectionBehavior>()
    );

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


c语言数组越界会怎么样
c语言指针怎么等于数组
c语言数组怎么存入文字
c语言中怎么显示数组
c语言数组元素怎么选
c语言数组怎么累加
c语言数组符号怎么输入
c语言怎么用长数组
c语言数组函数怎么输入
c语言数组怎么去掉差异
c语言怎么求解数组
c语言数组怎么用变量
c语言怎么申明数组
c语言怎么控制数组
c语言怎么计算数组长度
c语言数组怎么插星号
c语言数组怎么加长度
c语言中怎么输出数组
c语言怎么记住数组边界
c语言数组怎么输入符号