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

Automatically implementing an interface for wrapping an existing implementation

我有一个 class A 实现接口 IA:

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

我想使用新的 class WrapA 来包装 A,它也将实现 IA,目的是通过调用来包装 A它的每一个功能都是一项新任务:

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

当然这很容易手动完成。

但我想要一种用于此包装的自动机制,类似于 mocks 用于模拟接口的机制。

如果它是在我之前完成的,我很想看到一个例子,或者任何关于如何实现它的想法。

为此,您可以使用 CodeDOM,一种动态创建代码的技术。您以面向对象的方式构建 namespace/class。有关详细文档,请参阅 MSDN CodeDOM

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

这是一个有点复杂的主题,因此您需要阅读一些文档,但由于它是一项 Microsoft 技术,因此它是一个有据可查的功能。阅读后,实现包装器将非常容易。

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

因为我已经使用了Unity Bootstrapper,所以集成起来很容易。

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

实施(简化,您需要注意 return 值):

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>();
    }
}