希望使用.Net核心创建一套微服务,我正在考虑为Startup类创建一个基类,它将负责配置常用功能,如日志记录,身份验证,端点健康检查,从而标准化我们所有的服务。
然而,我很惊讶,似乎没有提到这样的模式。是使用自定义中间件来实现常用功能的首选模式吗?任何有关这种困境的想法或经验都将受到赞赏。答案 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/
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
}
}