在ASP.NET Core DI中添加实现而不是其接口

时间:2018-03-08 14:37:16

标签: c# asp.net-core dependency-injection

添加实现而不是其接口之间的区别是什么?我只有一个这个接口的实现?

// Adds a transient service by type of the implementation:
services.AddTransient(typeof(SomeConcreteService));

// Adds a transient service by interface of the concrete implementation type:
services.AddTransient<ISomeService, SomeConcreteService>();

3 个答案:

答案 0 :(得分:2)

services.AddTransient<ISomeService, SomeConcreteService>();

这种方式是首选,因为它允许您以正确的方式使用依赖注入。

如果您在所有控制器中使用接口,然后决定要更改具体实现,则只需编辑Startup.cs中的一行

public HomeController(ISomeService someService)
{
      //..
}

答案 1 :(得分:2)

添加实现时,您只能将其作为实现注入。

services.AddTransient(typeof(SomeConcreteService));

现在以ISomeService注入此内容会导致错误。

虽然这个

services.AddTransient<ISomeService, SomeConcreteService>();

将允许您注入接口而不是实现。

最后它是loosley coupeling。它还使您的软件更难测试。

如果您只注入接口,您可以轻松地测试使用其给定接口bc的实现的类,您可以毫无困难地模拟它。如果您没有注入实际实现,则必须将实现的功能标记为虚拟以模拟它们。您还需要模拟实现SomeConcreteService可能正在使用的类。

答案 2 :(得分:1)

今天你有一个接口的实现。明天你可能不会。其他人可能需要使用decoratorcomposite或其他设计模式来扩展服务。

基本上,通过使用界面,您可以针对每种可能性进行面向未来的应用程序 - 它甚至可以以您今天无法预见的方式进行扩展,而无需更改DI容器注册之外的单行代码。

如果使用混凝土类型,则扩展它的能力非常有限。你基本上是说“这就是永远的方式”而不允许在不改变代码的情况下扩展的许多可能性。您正在放弃使用DI模式的最有用的好处 - 通过将其接口与其实现分离来松散地耦合您的代码。