asp.net-mvc - 如何从 Controller 为存储库的构造函数指定参数?

标签 asp.net-mvc asp.net-web-api controller repository asp.net-web-api-routing

我对my question here有一个很好的答案,但我不确定是否可以将该答案应用于我的项目,因为我显然需要在我的 Controller 中使用类似这样的代码:

return DBConnectionStrings[DBSpecifier].Get(ID, CountToFetch);

...(其中 DBConnectionStrings 是字典)而不是:

return deptsRepository.Get(ID, CountToFetch);

真正的问题/挑战是我需要我的存储库的构造函数能够接受参数,以便相应地更改数据库连接字符串。然后,这些构造函数可以使用前一篇文章中建议的字典,这样就不用像这样开始了:

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))
    {

但是我如何从 Controller 中为存储库的构造函数指定一个参数(它用于填充存储库的方法然后查询的数据存储)?目前,典型的 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);
}

我是走在正确的道路上,还是找错了方向?

最佳答案

如果您想避免使用任何 IoC,您可以选择以下选项。

  1. 如果用户只能将 dbInstance 指定为方法参数,那么拥有多个 DuckbillRepository 类型的构造函数并只需调用适当的一个就足够了。

    public IEnumerable<Duckbill> GetBatchOfDuckbillsByStartingID(
        string dbInstance, 
        int id, 
        int countToFetch)
    {
        var duckbillsRepository = new DuckbillRepository(dbInstance);
        return duckbillsRepository.Get(id, countToFetch);
    }
    
  2. 如果可以在 DuckbillItemsController 的构造函数中获取 dbInstance,那么我将实现 duckbillRepository 字段并在构造函数。

    /// <summary>
    /// Dependency Injection friendly controller.
    /// </summary>
    public class DuckbillItemsController : ControllerBase
    {
        public readonly DuckbillRepository duckbillRepository;
    
        public IEnumerable<Duckbill> GetBatchOfDuckbillsByStartingID(
            int id, 
            int countToFetch)
        {
            return duckbillRepository.Get(id, countToFetch);
        }
    
        /// <summary>
        ///     <see cref="HttpContext.Current"/> can be a source 
        ///     of 'dbInstance' variable.
        /// </summary>
        public DuckbillItemsController()
            : this(HttpContext.Current.Request["dbInstance"])
        {
        }
    
        public DuckbillItemsController(string dbInstance)
            : this(new DuckbillRepository(dbInstance))
        {
        }
    
        public DuckbillItemsController(DuckbillRepository duckbillRepository)
        {
            this.duckbillRepository = duckbillRepository;
        }
    }
    

如果可以使用 IoC,那么您可以阅读 Passing ArgumentsCastle Windsor国际奥委会。

var repository = 
    container.Resolve<DuckbillRepository>(new Arguments(new { dbInstance }));

This approach is useful for parameters that are available in the composition root, like your Program.Main method. While it may look simple at the beginning, and is in fact often used by people new to Windsor, it's applicability is generally quite limited, and the other two ways are used much more often.

  1. Registration time - DependsOn 和 DynamicParameters
  2. Resolution time - 类型工厂

关于asp.net-mvc - 如何从 Controller 为存储库的构造函数指定参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20641901/

相关文章:

asp.net-mvc - MVC导航到其他 Controller View

asp.net-mvc - 使用模型和 htmlhelper 渲染部分 View

docker - Dockerize asnet核心webapi

c# - ASP.NET Web API IExceptionLogger 不捕获异常

javascript - NodeJs MVC架构,这是通心粉代码吗?

PHP Yii 框架 - Controller 工作不正常?

c# - 从 GLOBAL.ASAX 访问 TempData

c# - autofac 每个请求类型单个实例

javascript - 在提交表单之前询问用户

c# - 在 VS 2008 中运行单元测试项目时出现 DisconnectedContext 错误