Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc .asp net mvc核心2定义服务,带有构造函数参数。_Asp.net Mvc_Dependency Injection_Asp.net Core Mvc - Fatal编程技术网

Asp.net mvc .asp net mvc核心2定义服务,带有构造函数参数。

Asp.net mvc .asp net mvc核心2定义服务,带有构造函数参数。,asp.net-mvc,dependency-injection,asp.net-core-mvc,Asp.net Mvc,Dependency Injection,Asp.net Core Mvc,我有一个服务,加在这里 public void ConfigureServices(IServiceCollection services) { services.AddScoped<IDNCoreBlobAgent, DNCoreBlobAgent>(); services.AddMvc(); } 我希望在控制器操作级别或ConfigureServices以外的其他位置传递这些参数。该操作将类似于: publ

我有一个服务,加在这里

 public void ConfigureServices(IServiceCollection services)
    {          
        services.AddScoped<IDNCoreBlobAgent, DNCoreBlobAgent>();
        services.AddMvc();
    }
我希望在控制器操作级别或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中,您应该使用IDNCoreBlobAgent主界面和DNCoreBlobAgent、DNCoreBlobAgent1等元素实现结构模式

增加


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

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


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

如何将这些参数存储在appsettings.json中?不,原因很多。首先,我希望能够在同一个应用程序中调用不同的容器,或者在一个调用中使用默认策略,或者在另一个调用中传递策略。containerName和policyName的值来自哪里?实际上只有几种方法可以做到这一点——如果它们是应用程序范围的配置值,那么它们就进入构造函数。如果它们是运行时值,则应将它们作为参数传递给SendHtmlBlob方法。如果不是,那么你有一个可以用设计模式解决的应用程序设计问题,而不是DI问题。它们是运行时的,所以是的,就像Tomas Smagurauskas建议的那样,它们现在将被传递到方法中。我不太喜欢它,因为这意味着我服务中的每个方法都必须将其作为参数,但可能更糟。因此我应该将这些作为参数传递给服务的方法,如blob.SendHtmlBlobstorageAccount、containerName、policyName、html?@greedyLump是的,这几乎是唯一一种非黑客方式。凭据,在secrets.json中可能更现实一些。但是你提出了一整套具体的实现方案?我该如何在一个控制器或控制器动作中指定我想要调用的?看看答案,我已经修改了它。
 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);
    }
IParameterFabric concreteParameters = ParameterFabricHelper.GetParameters(CloudStorageAccount storageAccount, string 
         containerName, string policyName = null);