【发布时间】:2018-01-07 03:08:19
【问题描述】:
有人可以演示如何在 ASP.NET Core 中成功声明依赖于主机名的静态项目变量吗?
以前我有类似下面的代码,使用 Global.asax 来识别项目正在运行的主机名,并设置一些整个项目可以使用的简单静态变量,例如“MvcApplication.Colour”
public static string Colour;
public static string ConnectionString;
public static string HostName = System.Web.Hosting.HostingEnvironment.ApplicationHost.GetSiteName().ToLower();
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ProjectSettings();
}
public static void ProjectSettings()
{
switch (HostName)
{
case "external-domain":
ConnectionString = WebConfigurationManager.ConnectionStrings["External"].ToString();
Colour = "blue";
break;
case "internal-domain":
ConnectionString = WebConfigurationManager.ConnectionStrings["Internal"].ToString();
Colour = "purple";
break;
default:
ConnectionString = WebConfigurationManager.ConnectionStrings["Test"].ToString();
Colour = "red";
break;
}
}
我见过将 AppSetting 传递给 HomeController 的示例,例如:
public class HomeController : Controller
{
private readonly Startup.AppSettings _appSettings;
public HomeController(IOptions<Startup.AppSettings> appSettings)
{
_appSettings = appSettings.Value;
}
public IActionResult Index()
{
var colour = _appSettings.Colour;
return View();
}
public IActionResult Error()
{
return View();
}
}
还看到了注入示例,直接在 ASP.NET Core MVC 应用程序中的 Razor 视图中使用 AppSettings,如下所示:
@using Microsoft.Extensions.Options
@{
@inject IOptions<Startup.AppSettings> OptionsAppSettings
@OptionsAppSettings.Value.Colour;
}
有没有类似于 Global.asax 的更简单的方法,而无需在每个 Controller 或每个 View 中重新声明?
我遇到的最大困难是如何在 Startup.cs 中获取主机名,它似乎只在事件之后可用,也许在控制器级别之前获取和设置这些变量。
任何帮助将不胜感激:-)
【问题讨论】:
-
U 可以像在 global.asax 中那样使用静态类。但不建议这样做。因为很难使用单元测试进行测试。正确的方法是像在示例中那样使用依赖注入
-
一个返回连接字符串和颜色并将其注入每个控制器的服务怎么样,您不需要将其注入视图,而是将其作为数据发送到视图。
-
我希望避免这种情况,该项目有多个控制器,因此重复代码以有效地做同样的事情,我已经在我的代码中演示了控制器方法,但谢谢。
标签: c# asp.net-core asp.net-mvc-5