【发布时间】:2014-01-05 16:08:23
【问题描述】:
我对@987654321@ 有一个很好的答案,但我不确定我是否可以将该答案应用到我的项目中,因为我显然需要在我的控制器中使用类似这样的代码:
return DBConnectionStrings[DBSpecifier].Get(ID, CountToFetch);
...(其中 DBConnectionStrings 是字典)而不是:
return deptsRepository.Get(ID, CountToFetch);
真正的问题/挑战是我需要我的存储库的构造函数能够接受一个 arg 以便相应地更改数据库连接字符串。然后,这些构造函数可以使用前面文章中建议的 Dictionary ,而不是像这样开始:
public DuckbillRepository()
{
using (var conn = new OleDbConnection(
@"Provider=Microsoft.Jet.OLEDB.4.0;User ID=NRBQ;Password=NRBQRotPS;Data
Source=C:\Platypus\DATA\PlatypusFlipper03.MDB;Jet OLEDB:System
database=C:\Platypus\Data\duckbill.mdw"))
{
...应该是这样的:
public DuckbillRepository(string DBToUse)
{
using (var conn = new OleDbConnection(
string.Format(@"Provider=Microsoft.Jet.OLEDB.4.0;User
ID=NRBQ;Password=NRBQRotPS;Data Source=C:\Platypus\DATA\{0}.MDB;Jet
OLEDB:System database=C:\Platypus\Data\duckbill.mdw", DBToUse))
{
但是我怎样才能从控制器中为存储库的构造函数指定一个 arg(用于填充存储库的方法随后查询的数据存储)?目前,典型的 Controller 如下所示:
static readonly IDuckbillRepository duckbillsRepository = new DuckbillRepository();
public IEnumerable<Duckbill> GetBatchOfDuckbillsByStartingID(int ID, int CountToFetch)
{
return duckbillsRepository.Get(ID, CountToFetch);
}
目前我能想出的最好的想法/最接近的是我需要这样的东西:
public IEnumerable<Duckbill> GetBatchOfDuckbillsByStartingID(string DBInstance, int ID, int CountToFetch)
{
IDuckbillRepository duckbillsRepository = new DuckbillRepository(DBInstance);
return duckbillsRepository.Get(ID, CountToFetch);
}
我是在正确的轨道上,还是在找错树?
【问题讨论】:
-
使用像 NInject 这样的 DI 容器。实际上,通常的做法是将整个存储库对象传递给您的控制器,而不是将 arg 传递给存储库的构造函数。
-
客户端通过http向控制器传递一个repository对象?这不是问题的过度复杂化,以及对 DRY 的违反以及对服务器特定实现细节的潜在危险传播吗?我不是说你错了,我只是感到惊讶/困惑。
-
不,客户端将字符串传递给服务器。 NInject 工厂使用字符串实例化一个 repo 并将其传递给控制器。
标签: asp.net-mvc asp.net-web-api controller repository asp.net-web-api-routing