Testing 当我们可以对委托进行DI以使其可测试时,为什么要提取接口?

Testing 当我们可以对委托进行DI以使其可测试时,为什么要提取接口?,testing,c#-4.0,dependency-injection,testdrivendesign,Testing,C# 4.0,Dependency Injection,Testdrivendesign,我在浏览SO时,在一个答案上看到了这样的评论: 为什么我们要进行提取接口的仪式 是否可以通过DI委托使其可测试 这表达了我在今年早些时候的一个想法。注入纯功能(我想是函数指针)而不是接口实现有什么内在的错误吗?描述接口的“仪式”一词听起来像是一个反静态输入的Ruby专家的评论。有了一个好的重构和模板工具,大多数仪式都不会被注意到 虽然传入代理有其位置,但具有接口的IoC通常更易于实现、使用、理解和维护 考虑一个典型的构造函数: 公共类MyClass { 公共MyClass(我易于理解) { 如果

我在浏览SO时,在一个答案上看到了这样的评论:

为什么我们要进行提取接口的仪式 是否可以通过DI委托使其可测试


这表达了我在今年早些时候的一个想法。注入纯功能(我想是函数指针)而不是接口实现有什么内在的错误吗?

描述接口的“仪式”一词听起来像是一个反静态输入的Ruby专家的评论。有了一个好的重构和模板工具,大多数仪式都不会被注意到

虽然传入代理有其位置,但具有接口的IoC通常更易于实现、使用、理解和维护

考虑一个典型的构造函数:

公共类MyClass
{
公共MyClass(我易于理解)
{
如果(easy==null)抛出新的ArgumentNullException(“easy”);
}
公共MyClass(函数IAmNot、函数Clear、关于一切的操作)
{
//多个空检查。
} 
}
公共界面我很容易理解
{
布尔点(整数a、整数b、整数点);
bool CanHazExecute();
动作run();
}

现在考虑一个类,该类返回另一个用于消费的接口:

公共MyClass
{
//伊法斯
公众我很容易理解FindEasy();
//不是伊法斯
Func ReturnPointStuffDoer();
Func ReturnCanHazExecuteCallback();
动作wowthisannoying();
}
var easy=myclassInstance.FindEasy();
var消费者=新的易消费者(easy);
....
var消费者=新的易消费者(
myClassInstance.ReturnPointStuffDoer(),
myClassInstance.ReturnCanHazExecuteCallback(),
myClassInstance.wowthissisannoying());
在后一个消费示例中,显而易见的清理是:

var consumer = new EasyConsumer(myclassInstance);

这意味着您需要使用接口替换类类型以进行模拟。

由于函数指针作为一种功能依赖于语言,我认为您的问题也是如此。那么什么语言呢?