所以,
// this doesn't work or make sense
services.AddScoped<IReadSomething>(sp => new Something());
services.AddScoped<IWriteSomething>(sp => new Something());
所以我有两个接口用于同一个类,IReadSomething
和IWriteSomething
,Class只是Something
。
它们需要作用域,因为它们将数据的子集从HttpContext
传输到任意框架独立的“DTO”。
它们都应该引用相同的Something
实例,显然只是暴露了一些读取,而另一些只是暴露了一些写入操作。所以它被编写在Middleware管道中的某个地方 - 应用程序的其余部分可以只使用IReadSomething
并读取数据,这样我们就可以减少意外的数据覆盖。
这样做,
services.AddScoped<IReadSomething, Something>();
services.AddScoped<IWriteSomething, Something>();
没有意义,因为它应该为每个接口创建一个新实例。
我想让Interface Segregation和Scoped Dependency Resolution协同工作让我感到失望 - 我觉得我不得不担心ASP.NET Core Scoped Service Factory还是什么?
我也使用结构图作为我的主要依赖性解析 - 所以使用它的答案很好。
使目标类作用域,然后将其与所需的接口关联
services.AddScoped<Something>();
services.AddScoped<IReadSomething>(sp => sp.GetService<Something>());
services.AddScoped<IWriteSomething>(sp => sp.GetService<Something>());
这样,对任一接口的调用将在范围内返回相同的实例