【发布时间】:2020-02-15 16:51:48
【问题描述】:
我认为我实现了一个糟糕的架构。请尝试关注我。
我有 project1 这是一个简单的刮板。每当它收到来自其抓取过程的响应时,它都希望将抓取的数据保存到数据库中。它有自己的 DI 容器。
我有 project2,它负责执行数据库迁移,我还将访问和修改数据库的逻辑放在这里。我只想将管理数据库的所有逻辑保留在一个地方。它有自己的 DI 容器。
最后,我有 project3,它是一个 API,每当被询问时,它都会为存储在数据库中的数据提供服务。它有自己的 DI 容器。
如您所见,project2 位于中间,它既被用于保存数据的爬虫项目使用,也被用于提供数据的 API 项目使用。 在 project2 中,我的 DI 注册如下所示:
private static IServiceCollection ConfigureServices(IConfiguration Configuration)
{
IServiceCollection services = new ServiceCollection();
// Inject IOptions<T>
services.AddOptions();
var dbSettings = Configuration.GetSection("Settings");
services.Configure<DbSettings>(dbSettings);
return services;
}
它所做的是查看 appsettings(只有一个连接字符串指向已保存的数据库)并准备 IOption 在需要的地方注入。 所以在 project2 中有一个例如检查数据库是否为空的方法。
public class DbClient : IDbClient
{
private readonly IOptions<DbSettings> _dbSettings;
public DbClient(IOptions<DbSettings> dbSettings)
{
_dbSettings = dbSettings;
}
public bool IsDbEmpty()
{
using (SqlConnection connection = new SqlConnection(_dbSettings.Value.ConnectionString))
{
var isEmpty = connection.QueryFirst<string>("SELECT COUNT(1) WHERE EXISTS (SELECT * FROM Test)");
Console.ReadLine();
}
}
}
猜猜问题出在哪里?每当我尝试从 project1(刮板)或 project3(API)调用此方法时,都不会注入 IOptions,因为我没有'不调用 project2 的容器。我该如何解决这个问题?提前致谢!
【问题讨论】:
-
“project2”是否需要它自己的容器?听起来它应该只是一个由 project1 和 project3 使用的类库
-
@devNull 不一定.. 但是如果不使用 IOption(因此是 DI)模式,我该如何将连接字符串传递给方法?
标签: c# .net dependency-injection containers