有人可以演示如何在 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();
    }
}

还看到了注入(inject)示例,直接在 ASP.NET Core MVC 应用程序中的 Razor View 中使用 AppSettings,如下所示:
@using Microsoft.Extensions.Options
@{
    @inject IOptions<Startup.AppSettings> OptionsAppSettings

    @OptionsAppSettings.Value.Colour;
}

有没有类似于 Global.asax 的更简单的方法而不必在每个 Controller 或每个 View 中重新声明?

我遇到的最困难的工作是如何在 Startup.cs 中获取主机名,它似乎只有在事件发生后才可用,也许可以在 Controller 级别之前获取和设置这些变量。

任何帮助将非常感激 :-)

最佳答案

通过更多的坚持和研究,我想出了如何将我以前的 MVC5 Global.asax 迁移到 ASP.NET Core Startup.cs 。您将在下面看到实现 Host 确定的 AppSettings 的所有相关代码。
appsettings.json

{
  "ConnectionStrings": {
    "External": "Data Source=externalserver;Initial Catalog=externaldatabase;Persist Security Info=True;User ID=externalid;Password=externalpassword",
    "Internal": "Data Source=internalserver;Initial Catalog=internaldatabase;Persist Security Info=True;User ID=internalid;Password=internalpassword",
    "Test": "Data Source=testserver;Initial Catalog=testdatabase;Persist Security Info=True;User ID=testid;Password=testpassword"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Debug",
      "System": "Information",
      "Microsoft": "Information"
    }
  }
}
AppSettings.cs
namespace WebApplication1
{
    public class AppSettings
    {
        public string Colour;

        public string ConnectionString;
    }
}
Startup.cs
using System;
using System.Net;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Logging;

namespace WebApplication1
{
    public class Startup
    {
        public AppSettings AppSettings;

        public static string Colour;

        public static string External;

        public static string HostName;

        public static string Internal;

        public static string Test;

        public Startup(IHostingEnvironment hostingEnvironment)
        {
            var configurationBuilder = new ConfigurationBuilder().SetBasePath(hostingEnvironment.ContentRootPath).AddJsonFile("appsettings.json", true, true).AddJsonFile($"appsettings.{hostingEnvironment.EnvironmentName}.json", true).AddEnvironmentVariables();

            Configuration = configurationBuilder.Build();

            External = Configuration.GetConnectionString("External");

            Internal = Configuration.GetConnectionString("Internal");

            Test = Configuration.GetConnectionString("Test");
        }

        public IConfigurationRoot Configuration { get; }

        public void ConfigureServices(IServiceCollection serviceCollection)
        {
            serviceCollection.AddMvc();

            serviceCollection.Configure<AppSettings>(appSettings =>
            {
                HostName = Dns.GetHostName().ToLower();

                switch (HostName)
                {
                    case "external-domain":
                        appSettings.ConnectionString = External;
                        appSettings.Colour = "blue";

                        break;
                    case "internal-domain":
                        appSettings.ConnectionString = Internal;
                        appSettings.Colour = "purple";
                        break;
                    default:
                        appSettings.ConnectionString = Test;
                        appSettings.Colour = "red";
                        break;
                }
            });
        }

        public void Configure(IApplicationBuilder applicationBuilder, IHostingEnvironment hostingEnvironment, ILoggerFactory loggerFactory)
        {
            loggerFactory.AddConsole(Configuration.GetSection("Logging"));
            loggerFactory.AddDebug();

            if (hostingEnvironment.IsDevelopment())
            {
                applicationBuilder.UseDeveloperExceptionPage();
                applicationBuilder.UseBrowserLink();
            }
            else {
                applicationBuilder.UseExceptionHandler("/Home/Error");
            }

            applicationBuilder.UseStaticFiles();

            applicationBuilder.UseMvc(routes =>
            {
                routes.MapRoute("default", "{controller=Home}/{action=Index}/{id?}");
            });
        }
    }
}
HomeController.cs
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Options;

namespace WebApplication1.Controllers
{
    public class HomeController : Controller
    {
        private readonly AppSettings _appSettings;

        public HomeController(IOptions<AppSettings> appSettings)
        {
            _appSettings = appSettings.Value;
        }

        public IActionResult Index()
        {
            var colour = _appSettings.Colour;

            return View();
        }

        public IActionResult Error()
        {
            return View();
        }
    }
}
在 View 中,您可以像这样使用依赖注入(inject):
@using Microsoft.Extensions.Options
@{
    @inject IOptions<AppSettings> OptionsAppSettings

    @OptionsAppSettings.Value.Colour;
}
我希望这对其他人有用:-)

关于c# - 如何将 C# MVC5 Global.asax 迁移到 ASP.NET Core Startup.cs,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/45417665/

10-12 00:29
查看更多