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