.Net核心启动基类

时间:2017-06-26 07:41:04

标签: c# asp.net-core .net-core

希望使用.Net核心创建一套微服务,我正在考虑为Startup类创建一个基类,它将负责配置常用功能,如日志记录,身份验证,端点健康检查,从而标准化我们所有的服务。

然而,我很惊讶,似乎没有提到这样的模式。是使用自定义中间件来实现常用功能的首选模式吗?任何有关这种困境的想法或经验都将受到赞赏。

2 个答案:

答案 0 :(得分:8)

IServiceCollection命名空间中的IApplicationBuilder和/或Microsoft.Extensions.DependencyInjection接口创建扩展方法:

public static IServiceCollection AddAllCoolStuff(this IServiceCollection services)
{
    if (services == null)
    {
        throw new ArgumentNullException(nameof(services));
    }

    services.AddSingleton<FooService>();
    services.AddTransient<IBooService, BooService>();
    ...

    return services;
}

public static IApplicationBuilder UseAllCoolStuff(this IApplicationBuilder app)
{
    if (app == null)
    {
        throw new ArgumentNullException(nameof(app));
    }

    app.UseMiddleware<SomeCoolMiddleware>();
    ...

    return app;
}

在你的创业公司中使用它们:

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

    public void Configure(IApplicationBuilder app, ILoggerFactory loggerFactory)
    {
        app.UseAllCoolStuff();
    }
}

答案 1 :(得分:2)

如果您真的希望这样做,可以使用IStartup接口或StartupBase类。我做了同样的事情,所以所有的微服务都有相同的配置,因为我们有很多微服务,因此更容易管理。

请参阅: https://www.strathweb.com/2017/06/resolving-asp-net-core-startup-class-from-the-di-container/

并且:https://docs.microsoft.com/en-us/dotnet/api/microsoft.aspnetcore.hosting.startupbase?view=aspnetcore-2.0

StartupBase的源代码可以在以下位置看到: https://github.com/aspnet/Hosting/blob/dev/src/Microsoft.AspNetCore.Hosting/Startup/StartupBase.cs

以下是IStartup界面:

public interface IStartup
{
    IServiceProvider ConfigureServices(IServiceCollection services);

    void Configure(IApplicationBuilder app);
}

以及如何使用它的一个例子:

public class Startup : IStartup
{
    public Startup(IHostingEnvironment env)
    {
        var builder = new ConfigurationBuilder()
            .SetBasePath(env.ContentRootPath)
            .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
            .AddJsonFile($"appsettings.{env.EnvironmentName}.json", optional: true)
            .AddEnvironmentVariables();
        Configuration = builder.Build();
    }

    public IConfigurationRoot Configuration { get; set; }

    public IServiceProvider ConfigureServices(IServiceCollection services)
    {
        // Add framework services
        return services.BuildServiceProvider();
    }

    public void Configure(IApplicationBuilder app)
    {
        var env = app.ApplicationServices.GetService<IHostingEnvironment>();
        var loggerFactory = app.ApplicationServices.GetService<ILoggerFactory>();

        // Set up application pipeline
    }
}