我使用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