最近,我开始在.NET核心中使用Worker服务和DI,我对通过构造函数和使用作用域注入服务之间的区别感到困惑。
我有端口转发软件,它通过创建许多PortForwarding类实例,根据用户的请求创建多个端口转发。
我的代码-只是与问题相关的行:
我就是这样注册服务的:
static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseSerilog()
.ConfigureServices((hostContext, services) =>
{
services.AddLogging();
services.AddScoped<ISocket, TheSocket>(); //TheSocket creates System.Net.Sockets.Socket
services.AddScoped<IPortForwarding, PortForwarding>();
<more implementation>
});然后,在PortForwarding对象中,我需要一个TheSocket : ISocket的实例,可以通过两种方式创建该实例:
然后,我使用套接字,在这两种情况下,应用程序都可以正常工作。
我读过关于DI的Microsoft,但是由于这两个版本的工作方式相同--至少在我的测试期间--我不确定使用哪个版本和为什么。
我唯一能看到的区别是,通过构造函数注入,我创建了套接字的一个实例,通过使用IServiceScopeFactory,我可以请求更多的实例--对吗?这是DI的这两种方法之间的唯一区别吗?
感谢您的任何澄清。
发布于 2021-11-23 18:33:05
您应该使用构造函数注入。
第一种方法看起来像是在使用DI内部的某些部分,而不是实际让DI容器完成它的工作,最后它看起来像一个"ServiceLocator“,现在被广泛认为是一种反模式。如果您试图通过单元测试来解决这个问题,您将发现自己正在模拟与类应该完成的任务完全无关的接口。
发布于 2022-06-29 01:18:14
第一个方法实际上创建了一个子容器,然后从子容器中获取服务实例。
一般建议从施工方法中注入。原因是如果您创建一个子容器,从子容器中创建的对象将在子容器被回收时被销毁,这意味着您需要自己管理子容器的生命周期及其创建服务。
https://stackoverflow.com/questions/70085947
复制相似问题