【发布时间】:2010-09-02 20:32:23
【问题描述】:
我见过这样的示例,其中向工厂提供接口并生成实现该接口的对象。这对我来说并不复杂,但我不明白如何使用它来实现行为。
以 WCF 中的 ChannelFactory 为例...当您从接口生成通道时,它会公开调用远程过程时的方法(来自接口)。我对如何做到这一点的知识似乎有一点差距。这可能是一种常见的设计模式,但我想我会再次使用 SO 作为研究扩展。
【问题讨论】:
我见过这样的示例,其中向工厂提供接口并生成实现该接口的对象。这对我来说并不复杂,但我不明白如何使用它来实现行为。
以 WCF 中的 ChannelFactory 为例...当您从接口生成通道时,它会公开调用远程过程时的方法(来自接口)。我对如何做到这一点的知识似乎有一点差距。这可能是一种常见的设计模式,但我想我会再次使用 SO 作为研究扩展。
【问题讨论】:
通常通过代码发射发生。请参阅 System.Reflection.Emit 中的类。
例如,您可以获取一个接口类型并检查它声明的方法,然后使用 TypeBuilder 构建您自己的继承它的类型,并在方法中实现您想要的任何功能(或者只是让它们为空/执行return default(T)),使用 MethodBuilder 等等,直到你对接口感到满意。
【讨论】:
模拟接口的模拟框架会生成一个实现该接口的动态类。模拟方法的行为将取决于框架。通常,除非通过 mock 提供实现,否则该方法不会执行任何操作。
例如:
Mock<IRepository> repMock = new Mock<IRepository>();
repMock.Setup(r => r.FindById(1)).Returns(new MyObject());
假设IRepository接口定义了FindByID方法,则mock的Setup方法动态生成该方法的实现并将其“注入”到mock中。这是使用Reflection.Emit 完成的,它可用于动态构建 IL 指令并即时编译它们。
【讨论】:
Mock<IRepository> 的对象不会被视为IRepository 本身。除此之外,是的,框架通常会使用反射来动态生成实现所需接口的 MockBase 类的一些变体,并且接口公开的方法是使用对控制预期行为的集中式 MockBase 成员的回调来实现的。