我正在学习.net内核的内置DI,为什么我可以在下面使用B
而不是A
呢?
interface IService
{
void Do();
}
class Service : IService
{
public void Do() => Console.WriteLine("Doing...");
}
class Program
{
static void Main()
{
using (ServiceProvider sp = RegisterServices())
{
sp.GetRequiredService<Service>().Do();
}
}
static ServiceProvider RegisterServices()
{
ServiceCollection sc = new ServiceCollection();
//sc.AddTransient<IService, Service>(); // A
sc.AddTransient<Service>(); // B
return sc.BuildServiceProvider();
}
}
发布于 2019-02-26 16:43:49
如果你这样做:
sc.AddTransient<Service>();
您正在告诉ServiceProvider
(容器),它必须能够解析Service
。当我要Service
的时候,给我Service
。
如果您有一个直接依赖于Service
的类,这将是可行的。例如:
public class DependsOnService
{
private readonly Service _service;
public DependsOnService(Service service)
{
_service = service;
}
}
但是在许多情况下(也许大多数情况下),我们将编写类来依赖抽象(比如接口),而不是直接依赖于具体的类。因此,更常见的情况是:
public class DependsOnService
{
private readonly IService _service;
public DependsOnService(IService service)
{
_service = service;
}
}
现在,当创建DependsOnService
时,容器必须解析IService
。它必须知道,当它被要求解析IService
时,它应该创建的实现是Service
。这就是它的作用:
sc.AddTransient<IService, Service>();
上面写着,当我要IService
时,给我Service
。
https://stackoverflow.com/questions/54889486
复制相似问题