C# 如何使用存储库和Web API选择不同的数据源实例?
我使用的是一个存储库,它在将子集返回给调用方之前填充要使用和查询的数据。下面是一个例子 控制器的代码如下所示:C# 如何使用存储库和Web API选择不同的数据源实例?,c#,asp.net-web-api,controller,repository,repository-pattern,C#,Asp.net Web Api,Controller,Repository,Repository Pattern,我使用的是一个存储库,它在将子集返回给调用方之前填充要使用和查询的数据。下面是一个例子 控制器的代码如下所示: public class DuckbillItemsController : ApiController { static readonly IDuckbillItemRepository DuckbillItemsRepository = new DuckbillItemRepository(); public IEnumerable<DuckbillItem
public class DuckbillItemsController : ApiController
{
static readonly IDuckbillItemRepository DuckbillItemsRepository = new DuckbillItemRepository();
public IEnumerable<DuckbillItem> GetBatchOfDuckbillItemsByStartingID(string ID, int CountToFetch)
{
return DuckbillItemsRepository.Get(ID, CountToFetch);
}
}
public class DuckbillItemsController : ApiController
{
static readonly IDuckbillItemRepository DuckbillItemsRepository1 = new DuckbillItemRepository(1);
static readonly IDuckbillItemRepository DuckbillItemsRepository2 = new DuckbillItemRepository(2);
static readonly IDuckbillItemRepository DuckbillItemsRepository3 = new DuckbillItemRepository(3);
. . .
public IEnumerable<DuckbillItem> GetBatchOfDuckbillItemsByStartingID(int DBSpecifier, string ID, int CountToFetch)
{
if (DBSpecifier == 1)
{
return DuckbillItemsRepository1.Get(ID, CountToFetch);
}
else if (DBSpecifier == 2)
{
return DuckbillItemsRepository2.Get(ID, CountToFetch);
}
else if (DBSpecifier == 3)
{
return DuckbillItemsRepository3.Get(ID, CountToFetch);
}
. . .
}
}
public DuckbillItemRepository(int DBSpecifier)
{
string id = string.Empty;
try
{
if (DBSpecifier == 1)
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQNRotPS;Password=NRBQNRotPS;Data Source=C:\PlatypusWin\DATA\PlatypusDAT01.MDB;Jet OLEDB:System database=C:\PlatypusWin\Data\NRBQ.mdw"))
}
else if (DBSpecifier == 2)
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQNRotPS;Password=NRBQNRotPS;Data Source=C:\PlatypusWin\DATA\PlatypusDAT02.MDB;Jet OLEDB:System database=C:\PlatypusWin\Data\NRBQ.mdw"))
}
else if (DBSpecifier == 3)
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQNRotPS;Password=NRBQNRotPS;Data Source=C:\PlatypusWin\DATA\PlatypusDAT03.MDB;Jet OLEDB:System database=C:\PlatypusWin\Data\NRBQ.mdw"))
}
. . .
return Repositories[DBSpecifier].Get(ID, CountToFetch);
using (var conn = new OleDbConnection(Repositories[DBSpecifier]))
……为此:
string uri = String.Format("http://platypi:28642/api/Duckbills/{0}/{1}/{2}", DBSpecifier, lastIdFetched, RECORDS_TO_FETCH);
对吧??但如果是这样,我如何提醒我的控制器根据所需的DB实例调用重载构造函数?我是否需要将控制器代码更改为以下内容:
public class DuckbillItemsController : ApiController
{
static readonly IDuckbillItemRepository DuckbillItemsRepository = new DuckbillItemRepository();
public IEnumerable<DuckbillItem> GetBatchOfDuckbillItemsByStartingID(string ID, int CountToFetch)
{
return DuckbillItemsRepository.Get(ID, CountToFetch);
}
}
public class DuckbillItemsController : ApiController
{
static readonly IDuckbillItemRepository DuckbillItemsRepository1 = new DuckbillItemRepository(1);
static readonly IDuckbillItemRepository DuckbillItemsRepository2 = new DuckbillItemRepository(2);
static readonly IDuckbillItemRepository DuckbillItemsRepository3 = new DuckbillItemRepository(3);
. . .
public IEnumerable<DuckbillItem> GetBatchOfDuckbillItemsByStartingID(int DBSpecifier, string ID, int CountToFetch)
{
if (DBSpecifier == 1)
{
return DuckbillItemsRepository1.Get(ID, CountToFetch);
}
else if (DBSpecifier == 2)
{
return DuckbillItemsRepository2.Get(ID, CountToFetch);
}
else if (DBSpecifier == 3)
{
return DuckbillItemsRepository3.Get(ID, CountToFetch);
}
. . .
}
}
public DuckbillItemRepository(int DBSpecifier)
{
string id = string.Empty;
try
{
if (DBSpecifier == 1)
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQNRotPS;Password=NRBQNRotPS;Data Source=C:\PlatypusWin\DATA\PlatypusDAT01.MDB;Jet OLEDB:System database=C:\PlatypusWin\Data\NRBQ.mdw"))
}
else if (DBSpecifier == 2)
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQNRotPS;Password=NRBQNRotPS;Data Source=C:\PlatypusWin\DATA\PlatypusDAT02.MDB;Jet OLEDB:System database=C:\PlatypusWin\Data\NRBQ.mdw"))
}
else if (DBSpecifier == 3)
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQNRotPS;Password=NRBQNRotPS;Data Source=C:\PlatypusWin\DATA\PlatypusDAT03.MDB;Jet OLEDB:System database=C:\PlatypusWin\Data\NRBQ.mdw"))
}
. . .
return Repositories[DBSpecifier].Get(ID, CountToFetch);
using (var conn = new OleDbConnection(Repositories[DBSpecifier]))
??当然不是,但是我怎么能攻击它呢
注:我知道使用MS Access是“有害的”;不过,我对此没有控制权/发言权。在这两种情况下,我都会维护一个字典或列表,由DBSpecifier编制索引。这将避免所有if/elseif语句。如果DBSpecifier可以从0开始,那么我将使用一个列表,否则如果您想微观管理DBSpecifier值,我将使用字典
static readonly Dictionary<int, IDuckbillItemRepository> Repositories = new Dictionary<int, IDuckbillItemRepository> {
{ 1, new DuckbillItemRepository(1) },
{ 2, new DuckbillItemRepository(2) },
{ 3, new DuckbillItemRepository(3) }
};
同样,在存储库实现中:
static readonly Dictionary<int, string> ConnectionStrings = new Dictionary<int, string> {
{ 1, "@"Provider=Microsoft.Jet.OLEDB.4.0;...DAT01.MDB..." },
{ 2, "@"Provider=Microsoft.Jet.OLEDB.4.0;...DAT02.MDB..." },
{ 3, "@"Provider=Microsoft.Jet.OLEDB.4.0;...DAT03.MDB..." }
};
或者,为了避免重复,可以在静态构造函数的for循环中初始化字典项
您还可以使用dictionary.ContainsKey(DBSpecifier)对无效的DBSpecifier值执行错误检查
如果您想玩得开心,可以根据需要惰性地加载存储库字典,方法是检查字典是否包含具有给定DBSpecifier的键,如果尚未添加,则创建并添加新的存储库