添加实现而不是其接口之间的区别是什么?我只有一个这个接口的实现?
// 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>();
答案 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)