【发布时间】:2019-07-09 23:45:42
【问题描述】:
我正在使用 ASP.NET 核心依赖注入在我的测试项目中,来设置我的测试使用的文本上下文(所以我不能在这里使用构造函数注入)。在 ConfigureServices 中,我注册了服务,效果很好:
public void ConfigureServices(IServiceCollection services)
{
// Scans assemblies and adds MediatR handlers, preprocessors, and postprocessors implementations to the container.
services.AddMediatR(
typeof(Application.Logic.Queries.FindUserByEmailAddressHandler));
services.AddTransient<ILocalDb, LocalDb>(l => new LocalDb(null));
services.AddTransient<IUnitOfWork, UnitOfWork>(uow => new UnitOfWork(""));
services.AddTransient<IUserRepository, UserRepository>();
}
但是,在尝试获取我的工作单元的实例时,我遇到了问题:
var localDb = serviceProvider.GetService<ILocalDb>();
var unitOfWork = serviceProvider.GetService<IUnitOfWork>(); <- need to pass constructor parameter
你看,UnitOfWork 构造函数接受一个连接字符串,我必须传递这个来自 localDb 的连接字符串(LocalDb 即时创建一个测试数据库)。
在 StructureMap 中,我可以在获取实例时将参数传递给构造函数,如下所示:
x.For<IUnitOfWork>().Use<UnitOfWork>().Ctor<string>().Is(localDb.ConnectionString); });
如何使用 ASP.NET Core 依赖注入来做到这一点?
【问题讨论】:
-
var localDb = serviceProvider.GetService<ILocalDb>();开头是错误的,称为服务定位器反模式。你到底为什么要这么做?另一个问题是服务 (UnitOfWork) 正在接收连接字符串,这仅意味着服务本身正在构建另一个依赖项。总的来说,结构是完全错误的 -
制作一些从 IUnitOfWork 派生的标记接口并制作一些基础存储库,现在您可以拥有一些具有相同功能和独立单元的基础服务...
-
或许我这里的回答可以帮到你:stackoverflow.com/questions/54490808/…
-
@Camilo Terevinto 我这样做是因为它在我的测试项目中,当我准备文本上下文时。我不能在这里使用构造函数注入。所以我不同意这是“完全错误的”,但也许你可以解释一下如何正确地做到这一点。
-
我认为最好使用 UnitOfWorkFactory 来创建您的 UnitOfWork
标签: c# asp.net-core dependency-injection asp.net-core-webapi