我有一项任务正在做一些我想限制的后台工作。我想注入(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/