ASP.NET 5 和 MVC 6 中将启动配置与 Web 项目分离的最佳方法

Best Way to Decouple Startup Configuration from Web Project in ASP.NET 5 and MVC 6

使用 MVC5,创建一个引用所有层的引导程序项目非常容易,从而将 UI 层与对基础设施逻辑的引用分离。该项目将包含启动配置逻辑,例如设置 IoC 容器。

这样做的方法是定义一个初创公司 class:

public class Startup
{
    public static void Start()
    {
        // startup configuration (IoC etc) goes here
    }
}

然后在AssemblyInfo.cs中添加一行:

[assembly: PreApplicationStartMethod(typeof(Startup), "Start")]

不幸的是,这种方法不再适用于 asp.net 5. 我简要地查看了文档,但我发现的是框架在 Web 中寻找名为 Startup 的 class项目。

我还查看了 Microsoft.AspNet.Hosting source code,它似乎负责查找 Startup class。我可以看到一些对配置的引用 class,因此有可能可以通过使用某种配置设置来加载程序集,但我无法确认这一点或确定是哪个设置。

另外,如果这是真的,当文件本身被加载到 Startup class 中时,如何使用 config.json 文件确定 Startup class?是否有不同的选项来配置启动程序集,例如使用环境变量?

您可以更改 WebHostBuilder 查找启动类型的程序集。

将名称为 Microsoft.AspNet.Hosting.ini 的 INI 配置文件添加到您的 wwwroot 文件夹,其内容如下:

[Hosting]
Application = App.Bootstrapper

其中 App.Bootstrapper 是您的应用程序引导程序项目的命名空间。

启动 class 必须看起来一样,例如ConfigureServicesConfigure:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // ...
    }

    public void Configure(IApplicationBuilder app)
    {
        // ...
    }
}

好奇的话可以看看判断启动类型的逻辑here。如果我们在 INI 文件中指定 Hosting:Application 键,它将使用该值而不是 appEnvironment.ApplicationName.

只是想关注一下,在asp.net核心rtm中,你既不需要任何.ini也不需要.json,你需要做的就是调用.UseStartup("NamespaceOfYourStartup") 并确保包含 Startup class 的程序集与您的 asp.net 核心 Web 项目发布文件的位置相同。