【问题标题】:.asp net mvc core 2 DI'ed service with constructor parameters..asp net mvc core 2 带有构造函数参数的 DI 服务。
【发布时间】:2018-02-03 22:04:41
【问题描述】:

我有一个服务,添加到这里

 public void ConfigureServices(IServiceCollection services)
    {          
        services.AddScoped<IDNCoreBlobAgent, DNCoreBlobAgent>();
        services.AddMvc();
    }

但是,我使用几个构造函数参数来设计它,以分离出我的凭据、blob 容器名称以及特定策略的可能性。

 public DNCoreBlobAgent(CloudStorageAccount storageAccount, string 
     containerName, string policyName = null)
    {
        //Does stuff with those parameters
    }

我想在控制器操作级别或 ConfigureServices 以外的其他地方传递这些参数。动作看起来像:

 public async Task<IActionResult> ProjectReport( [FromServices] 
     IDNCoreBlobAgent blob, int projectid)
    {
        Project project = _data.GetProject(projectid);
        string html = GetHtml();            
        var link = blob.SendHtmlBlob(html);            
        return PartialView("_ProjectReport", link);
    }

这是错误的处理方式吗?我不应该把它作为一项服务吗?

【问题讨论】:

  • 将这些存储在appsettings.json 中怎么样?
  • 不,有很多原因。一方面,我希望能够在同一个应用程序中调用不同的容器,或者在一次调用中使用默认策略或在另一个调用中传递策略。
  • containerNamepolicyName 的值从何而来?实际上只有几种方法可以实现 - 如果它们是应用程序范围的配置值,那么它们会进入构造函数。如果它们是运行时值,那么它们应该作为参数传递给SendHtmlBlob 方法。如果其他,那么你有一个可以用设计模式解决的应用程序设计问题,而不是 DI 问题。
  • 它们是运行时的,所以是的,就像 Tomas Smagurauskas 建议的那样,它们现在将被传递到方法中。我不太喜欢它,因为这意味着我的服务中的每个方法都必须将其作为参数,但情况可能更糟。

标签: asp.net-mvc dependency-injection asp.net-core-mvc


【解决方案1】:

这违背了依赖注入的思想。依赖注入提供基于控制反转的工作,因此所有组件都是按照从最低级别到最高级别的顺序创建的。因此,理论上,在你的服务被创建的时候,控制器还不存在,所以它不可能向服务的构造函数传递任何参数。

预期的设计确实是在操作级别而不是在构造函数级别传递这些参数。

【讨论】:

  • 所以我应该将这些作为参数传递给服务的方法,如 blob.SendHtmlBlob(storageAccount, containerName, policyName, html)?
  • @greedyLump 是的,这几乎是唯一的非 hacky 方式。
【解决方案2】:

我不知道你的具体任务,但如果你不想在appsettings.json 中设置设置,你可以使用IDNCoreBlobAgent 主界面和DNCoreBlobAgentDNCoreBlobAgent1 等实现织物模式。元素。

(已添加)

IParameterFabric concreteParameters = ParameterFabricHelper.GetParameters(CloudStorageAccount storageAccount, string 
         containerName, string policyName = null);

GetParameters 将是您需要具体实现的条件。

【讨论】:

  • 凭证,也许(在secrets.json 中更真实)。但是你提出了一整套具体的实施方案?以及如何在我想要调用的控制器或控制器操作中指定?
  • 看答案,我已经修改了。
猜你喜欢
  • 1970-01-01
  • 2021-04-05
  • 2016-07-26
  • 2019-05-21
  • 2014-08-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-04
相关资源
最近更新 更多