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的键,如果尚未添加,则创建并添加新的存储库