我使用SimpleInjector作为我的C#WinForms应用程序。 我需要在运行时决定要访问哪个存储库(Oracle或SqlServer),因为这取决于用户要连接到哪个数据库。 目前我是这样做的,只要我为存储库添加装饰器就会失败。如何使用数据库特定的存储库
_container.RegisterCollection<IRepository>(
new[] { typeof(OraRepository), typeof(SqlRepository) });
,并区分使用哪一个,我使用了一个供应商类就像这样:
public T GetRepo<T>(bool oracle)
where T : class
{
var instances = _container.GetAllInstances<T>();
if (oracle)
{
return instances.First(i => i.GetType().Name.StartsWith("Ora"));
}
else
{
return instances.First(i => !i.GetType().Name.StartsWith("Ora"));
}
}
我不想增加一个装饰为每个数据库。此外,它似乎是不可能的,因为没有RegisterDecoratorCollection
;-)
而且我的胃告诉我,依靠上述类型的字符串名称是不正确的。 这应如何正确完成?
编辑:
关于使用场景 更先进的信息:
我的单元测试:
[TestInitialize()]
public void MyTestInitialize()
{
var container = new SimpleInjector.Container();
... other dependencies ...
container.RegisterCollection<ICarRepository>(
new[] { typeof(OraCarRepository), typeof(SqlCarRepository) });
container.RegisterCollection<ITruckRepository>(
new[] { typeof(OraTruckRepository), typeof(SqlTruckRepository) });
_provider = new RepoProvider(container);
}
运行测试:
[TestMethod()]
public void GetRepoTest()
{
var repo = _provider.GetRepo<ICarRepository>(true);
Assert.AreEqual(typeof(OraCarRepository), repo.GetType());
repo = _provider.GetRepo<ICarRepository>(false);
Assert.AreEqual(typeof(SqlCarRepository), repo.GetType());
var repo2 = _provider.GetRepo<ITruckRepository>(true);
Assert.AreEqual(typeof(OraTruckRepository), repo2.GetType());
repo2 = _provider.GetRepo<ITruckRepository>(false);
Assert.AreEqual(typeof(SqlTruckRepository), repo2.GetType());
}
库如何选择?用户在应用程序运行时是否从一个数据库更改为另一个数据库,或者在启动期间是否确定一次(例如,通过在配置文件中指定)? – Steven
是的,它正在运行。用户可以选择在Oracle上运行一个分析,在SqlServer上运行下一个分析,而不必重新启动应用程序。 – user213360
此外,处理的数据格式相同。 oracle或sqlserver数据由相应的存储库放入业务实体中,以供业务层进一步处理。 @Steven任何更新这个额外的信息? – user213360