如何解决.Net Core多个启动文件和不同API版本的服务实现
我想要Net Core 3.1中的两个版本的api网关(1.0和2.0)。此外,我还有一个缓存和权限服务。 1.0版是否可能具有与2.0版不同的权限服务实现?可以有两个不同的启动文件吗?
解决方法
据我所知,我们可以有Startup类约定和Startup方法约定。
应用程序可以为不同的环境定义多个启动类。在运行时选择适当的Startup类。名称后缀与当前环境匹配的类具有优先级。如果找不到匹配的Startup {EnvironmentName}类,则使用Startup类。
这意味着您可以拥有多个startup.cs,如StartupDevelopment,StartupProduction,Startup。如果您的主机应用程序的服务器环境变量“ ASPNETCORE_ENVIRONMENT”已设置为"Development"
,它将使用StartupDevelopment。如果没有与ASPNETCORE_ENVIRONMENT
相匹配的startup.cs,它将使用默认的Startup.cs。
有关如何设置环境变量的更多详细信息,您可以参考此article。
以下代码:
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> ...){}
}
或为multiple middleware pipelines配置不同的服务。但这感觉太复杂了。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。