.Net Core用于不同api版本控制的多个启动文件和服务实现



我想要NetCore3.1中的两个版本的api网关(1.0和2.0(。此外,我还有一个缓存和权限服务。1.0版是否可能具有与2.0版不同的权限服务实现?有可能有两个不同的启动文件吗?

据我所知,我们可以有Startup类约定和Startup方法约定。

启动类约定:

该应用程序可以为不同的环境定义多个启动类。在运行时选择适当的启动类。名称后缀与当前环境匹配的类将按优先级排列。如果找不到匹配的Startup{EnvironmentName}类,则使用Startup类。

这意味着你可以有多个startup.cs,如StartupDevelopment、StartupProduction、startup。如果您的主机应用程序的服务器环境变量";ASPNETCORE_环境";已设置为"Development",则将使用StartupDevelopment。如果没有与ASPNETCORE_ENVIRONMENT匹配的startup.cs,它将使用默认的startup.chs。

关于如何设置环境变量的更多详细信息,您可以参考本文。

代码如下:

public class StartupDevelopment
{
public StartupDevelopment(IConfiguration configuration)
{
Configuration = configuration;
Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name);
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
app.UseDeveloperExceptionPage();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
public class StartupProduction
{
public StartupProduction(IConfiguration configuration)
{
Configuration = configuration;
Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name);
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app)
{
app.UseExceptionHandler("/Error");
app.UseHsts();
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
Console.WriteLine(MethodBase.GetCurrentMethod().DeclaringType.Name);
}
public IConfiguration Configuration { get; }
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
else
{
app.UseExceptionHandler("/Error");
app.UseHsts();
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapRazorPages();
});
}
}

您最好注册两个不同的服务实现,它们具有两种不同的接口类型。

interface IPermissions {}
interface IPermissionsV2 : IPermissions {}
class PermissionsV1 : IPermissions {}
class PermissionsV2 : IPermissionsV2 {}
public class APIV1{
public APIV1(IPermissions ...){}
}
public class APIV2{
public APIV2(IPermissionsV2 ...){}
}
// etc

尽管可以使用代理服务来定位真正的服务。这感觉像是一种我不应该推荐的反模式;

interface IPermissions {}
interface IPermissions<T>:IPermissions {}
public class PermissionsV1 : IPermissions {}
public class PermissionsV2 : IPermissions {}
public class PermissionsProxy : IPermissions<T>{
private IPermissions implementation;
public PermissionsProxy (IServiceProvider provider){
if (typeof(T) ... )
implementation = provider.GetService<PermissionsV1>();
// etc
}
public void Method() => implementation.Method();
}
public class APIV1{
public APIV1(IPermissions<APIV1> ...){}
}
public class APIV2{
public APIV2(IPermissions<APIV2> ...){}
}

或者使用不同的服务配置多个中间件管道。但这感觉太复杂了。

最新更新