【发布时间】:2016-10-06 00:12:32
【问题描述】:
考虑以下场景。
public interface IRestaurant<IDinner, IDesert> { }
public class Pasta : IDinner {}
public class Cake : IDesert {}
public class Chef
{
// resolving a mix of interfaces and concrete classes
public Chef(IRestaurant<Pasta, Cake>) { }
}
注入两个具体类是否违背了依赖注入的目的?我的感觉是确实如此,因为我们现在与Pasta 和Cake 类强耦合,而依赖注入可以打破这种耦合。
以下内容会更有意义吗?
public class Chef<IDinner, IDesert>
{
public Chef(IRestaurant<IDinner, IDesert>) { }
}
【问题讨论】:
-
除了意大利面和蛋糕外,厨师可以做一顿有晚餐和甜点的饭吗?
-
在第一个例子中,没有,在第二个例子中,是的。
-
我想这归结为意图,如果厨师只能处理这种组合,那么使用具体类型似乎很好。如果他们可以处理比这更多的组合,那么泛型会更合适。也许如果你把它写成
public class PastaAndCakeChef,意图会更明显? -
我不认为注入混凝土本身总是一件坏事,但如果你打算创造一些通用的东西,第二种方法是最好的
-
您正在使用依赖注入来确保为您提供合适的餐厅,我猜有哪个餐厅供应意大利面和蛋糕?依赖注入的重点实际上是管理生命周期和实现选择。如果您可以在对象之外控制实现选择,那么解耦会变得更容易,但它不是 DI 的唯一点。
标签: c# generics dependency-injection interface