繁体   English   中英

自动实现用于包装现有实现的接口

[英]Automatically implementing an interface for wrapping an existing implementation

我有一个实现接口IA的类A

class A : IA
{
   f(){...}
}

我想换A使用一个新的类WrapA将实现IA为好,以捆绑的意向A通过调用其功能作为一项新的任务每一项:

class WrapA : IA
{
  private A;
  f()
  {
    StartInNewTask(A.f());
  }
}

当然,这很容易手动完成。

但是我想要这种包装的自动机制,类似于模拟接口的模拟。

如果它是在我想看到一个示例或有关如何实现它的任何想法之前完成的。

为此,您可以使用CodeDOM(一种动态创建代码的技术)。 您以面向对象的方式构造名称空间/类。 有关详细文档,请参见MSDN CodeDOM

在您的情况下,您需要使用Type.GetMethods -Method读取要通过反射包装的方法。 因此,您可以使用CodeMethodInvokeExpression访问目标方法。 您需要对包装对象的引用,您可以使用CodeVariableReferenceExpression访问该CodeVariableReferenceExpression 这样,您可以使用CodeMethodInvokeExpression调用Task.Run() - Task.Run()或您使用的任何方法),并提供对目标对象的Delegate和引用。

这个话题有点复杂,因此您需要阅读一些文档,但是由于它是Microsoft技术,因此文档功能非常丰富。 阅读完该书后,即可轻松实现包装器。

我发现最好的框架是Unity的拦截器。

由于我已经使用过Unity Bootstrapper,因此集成起来非常容易。

https://msdn.microsoft.com/en-us/library/dn178466%28v=pandp.30%29.aspx

实现(简化后,您需要注意返回值):

public class RestPerformanceInterceptor : IInterceptionBehavior
{
    public bool WillExecute { get { return true; } }

    public IEnumerable<Type> GetRequiredInterfaces()
    {
        return new[] { typeof(IA) };
    }

    public IMethodReturn Invoke(IMethodInvocation input, GetNextInterceptionBehaviorDelegate getNext)
    {
        var behaviorDelegate = getNext();

        StartInNewTask(behaviorDelegate.Invoke(input, getNext));

        return new Mock<IMethodReturn>();
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM