【发布时间】:2019-04-05 02:00:48
【问题描述】:
我有一个用例,我需要在我的数据访问层中使用多个连接字符串,并且会根据输入使用任何人。
目前,我在 JSON 中添加了 2 个连接字符串,然后我将两者都注入。
是否有任何其他解决方案可以一次注入所有连接字符串,因为将来引入任何新数据库时,我必须在 JSON 中再添加一个连接字符串,然后再次注入它?
启动类:
private static void Main(string[] args)
{
ServiceCollection serviceCollection = new ServiceCollection();
ConfigureServices(serviceCollection);
IServiceProvider serviceProvider =
serviceCollection.BuildServiceProvider();
serviceProvider.GetService<StudentApp>().Start();
}
private static void ConfigureServices(IServiceCollection
serviceCollection)
{
IConfigurationRoot configuration = GetConfiguration();
Database database1 = new SqlDatabase(configuration.GetSection("Configuration:ConnectionString1").Value;
Database database2 = new SqlDatabase(configuration.GetSection("Configuration:ConnectionString2").Value;
// Here I am doing Multiple injections
serviceCollection.AddSingleton(database1);
serviceCollection.AddSingleton(database2);
serviceCollection.AddOptions();
serviceCollection.Configure<AppSettings(configuration.GetSection("Configuration"));
serviceCollection.AddSingleton(configuration);
serviceCollection.AddTransient<IStudentDataAccess,StudentDataAccess>();
serviceCollection.AddTransient<StudentApp>();
}
private static IConfigurationRoot GetConfiguration()
{
return new ConfigurationBuilder()
.AddJsonFile("appsettings.json", optional: true)
.Build();
}
StudentApp 类:
private readonly IStudentDataAccess _dataAccess;
private readonly AppSettings _config;
private readonly Database _database1;
private readonly Database _database2;
public StudentApp(IStudentDataAccess dataAccess,IOptions<AppSettings>
config, Database database1, Database database2)
{
_dataAccess= dataAccess;
_config = config.Value;
_database1 = database1;
_database2 = database2;
}
public void Start()
{
int count= _dataAccess.GetStudentCount(deptId);
}
数据访问类:
public interface IStudentDataAccess
{
int GetStudentCount(int deptId);
}
public class StudentDataAccess : IStudentDataAccess
{
private readonly AppSettings _config;
private readonly Database _database1;
private readonly Database _database2;
public StudentDataAccess (IOptions<AppSettings> config, Database
database1,Database database2)
{
_config = config.Value;
_database1 = database1;
_database2 = database2;
}
public int GetStudentCount(int deptId)
{
// Execute queries either by Database1 or 2.
}
}
使用的数据库类来自 Microsoft.Practices.EnterpriseLibrary.Data。 如何避免为不同的连接字符串创建多个 Singleton 类?
有什么帮助吗?
【问题讨论】:
-
您的数据库类可以有一个带有
IEnumerable<string> connectionStrings参数的构造函数,并在内部处理每个查询应该针对哪个连接启动。 -
@bradbury9:这个数据库类不是我创建的,它来自 Microsoft.Practices.EnterpriseLibrary.Data 库。
标签: c# dependency-injection solid-principles