自动实现用于包装现有实现的接口
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>();
}
}
我有一个 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>();
}
}