C# 如何调用实现DI的另一个项目的方法
我想我实现了一个糟糕的架构。请跟我来 我有project1,它是一个简单的刮刀。每当它收到来自其刮取过程的响应时,它都希望将刮取的数据保存到数据库中。它有自己的DI容器 我有project2,它负责执行DB迁移,我还将访问和修改数据库的逻辑放在这里。我想把管理数据库的所有逻辑只放在一个地方。它有自己的DI容器 最后,我有project3,这是一个API,无论何时被要求,它都为数据库中存储的数据提供服务。它有自己的DI容器C# 如何调用实现DI的另一个项目的方法,c#,.net,dependency-injection,containers,C#,.net,Dependency Injection,Containers,我想我实现了一个糟糕的架构。请跟我来 我有project1,它是一个简单的刮刀。每当它收到来自其刮取过程的响应时,它都希望将刮取的数据保存到数据库中。它有自己的DI容器 我有project2,它负责执行DB迁移,我还将访问和修改数据库的逻辑放在这里。我想把管理数据库的所有逻辑只放在一个地方。它有自己的DI容器 最后,我有project3,这是一个API,无论何时被要求,它都为数据库中存储的数据提供服务。它有自己的DI容器 正如你所看到的,Projt2位于中间,在保存数据和用于服务数据的API项目
正如你所看到的,Projt2位于中间,在保存数据和用于服务数据的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;
}
它所做的是查看应用程序设置,只有一个连接字符串指向已保存的数据库,并准备在需要时注入IOption。
因此,在project2中有一个示例,例如检查DB是否为空的方法
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的容器。我如何解决这个问题?提前谢谢 一种方法是让您的共享项目2公开一些可供消费应用程序project1和project3使用的配置功能 对于.NET Core,您可以通过在共享项目2中定义IServiceCollection扩展方法来实现这一点:
请注意,然后您可以在使用project2的任何项目中定义project2所需的配置。project2是否需要自己的容器?听起来它应该是project1和project1使用的类库project3@devNull不一定。。但是,如果不使用IOption,因此使用DI模式,我如何将连接字符串传递给方法呢。。原因是,当您从例如project1调用扩展方法时,必须通过IConfiguration。。在这种情况下,您传递的IConfiguration是project1的IConfiguration,它不包含project2..@Tarta的appsettings,因此我的评论是,您可以在使用它的任何项目中定义project2所需的配置。这通常是配置的工作方式。如果这些设置是可配置的,那么您只需在AddProject2方法中硬编码即可。哦,现在我明白了!但这样一来,我不再保留我试图通过分离角色来实现的单一责任。我的意思是,我想在项目中保留与数据库相关的所有内容2。。通过这种方式,现在我还必须在另一个数据库中定义连接字符串projects@Tarta潜在地虽然也有解决这个问题的办法,比如
public static class ServiceCollectionExtensions
{
public static IServiceCollection AddProject2(this IServiceCollection services, IConfiguration configuration)
{
services.AddOptions();
var dbSettings = configuration.GetSection("Settings");
services.Configure<DbSettings>(dbSettings);
return services;
}
}
public void ConfigureServices(IServiceCollection services)
{
...
services.AddProject2(Configuration);
...
}