AspNet核心范围的依赖项接口隔离

时间:2018-09-11 14:49:30

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

所以

// this doesn't work or make sense
services.AddScoped<IReadSomething>(sp => new Something());
services.AddScoped<IWriteSomething>(sp => new Something());

因此,对于同一个类,我有两个接口IReadSomethingIWriteSomething,该类仅为Something

它们需要确定范围,因为它们会将数据的子集从HttpContext传输到独立于框架的任意“ DTO”。

它们都应引用Something的相同实例,显然一个实例仅公开一些读取操作,而另一个实例则公开一些写入操作。因此,它被写入了中间件管道中的某个位置-应用程序的其余部分可以仅使用IReadSomething并读取数据,从而可以减轻意外的数据覆盖。

正在做

services.AddScoped<IReadSomething, Something>();
services.AddScoped<IWriteSomething, Something>();

也没有意义,因为很正确,它应该为每个接口创建一个新实例。

要使接口隔离和作用域依赖性解析一起工作,我缺少什么?我感觉我不得不担心ASP.NET Core作用域服务工厂之类的事情吗?

我也正在使用structuremap来实现主要的依赖项解析-因此可以用一个答案很好。

1 个答案:

答案 0 :(得分:8)

使目标类具有作用域,然后将其与所需的接口关联

services.AddScoped<Something>();
services.AddScoped<IReadSomething>(sp => sp.GetService<Something>());
services.AddScoped<IWriteSomething>(sp => sp.GetService<Something>());

这样,对任一接口的调用将在范围内返回相同的实例