c# - 使用 DI 的单一方法委托(delegate) vs 接口(interface)

标签 c# .net interface dependency-injection delegates

我有一项任务正在做一些我想限制的后台工作。我想注入(inject) void Throttle(taskState)方法。它可以像 Thread.Sleep(delay) 一样简单用于调试目的,但它可能更复杂,进行一些日志记录等。

我在委托(delegate)和具有单一方法的接口(interface)之间进行选择,作为任务驱动类构造函数的参数。 选择哪个选项?

IMO,当谈到 DI 时,接口(interface)相对于委托(delegate)的主要优势是可扩展性。可以轻松添加新方法。我可以创建 interface I2: I1 { ... } , 有类工具 I2 , 并仍然将其实例注入(inject)为 I1 .客户端代码可以选择将其转换为 I2 , 查看是否支持新功能。

但是,如果我只需要注入(inject)一个方法,我认为委托(delegate)会更有意义,无论我是否需要维护状态。委托(delegate)也可以维护状态,例如:

static Action<TaskState> GetThrottle(int delay) 
{ 
    return (s) => Thread.Sleep(delay++);
} 

我会明确地键入我的委托(delegate),而不是使用 Action<>Func<> .

目前,我计划有一个单独的static各种类Throttle像上面那样的实现。

我没有为这个项目使用任何 DI 框架。

这是正确的选择吗?我应该改用界面吗?

如果您认为答案主要基于意见,请投票结束此问题,这也会有所帮助。

最佳答案

将接口(interface)传递给构造函数的一个好处是它使依赖项解析更容易在 DI 框架中声明。如果有一个类。

public class ClassA{
    public ClassA(IInterface interface){
    ...
    }
}

然后使用像 Unity 这样的 DI 框架我可以像这样轻松地注册类型

 container.RegisterType<IInterface, ConcreteImplementation>();

与委托(delegate)相处有点困难。你可能不得不做类似的事情。

public class ClassA{
    public ClassA(Delegate delegateInstance){
    ...
    }
}

然后注册依赖关系有点困难。

 container.RegisterType<ClassA>(
     new InjectionFactory(a => {
         return new ClassA(()=>{/*delegate code*/});
 }));

关于c# - 使用 DI 的单一方法委托(delegate) vs 接口(interface),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21319300/

相关文章:

c# - 使用 asp.net core 2.1 执行获取操作

c# - 在 Visual Studio 2012 中调试 .NET Framework 源代码?

c# - 拒绝访问HRESULT : 0x80070005 (E_ACCESSDENIED)) on SetInputToDefaultAudioDevice();

C# 将对象写入二进制文件

c# - 为什么实现带有类型约束的泛型接口(interface)的泛型类需要重复这些约束?

java - 如何用 Java 编写可靠的纯聚合(组合)游戏对象?

c# - 使用异步绑定(bind)时如何避免闪烁

c# - 如何在 C# 中将文档类型添加到新的 XML 文件

c# - C# 中的简单浏览器控件

ios - 将界面生成器中的 tableView 连接到 NON-outlet 变量