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