我正在尝试找出一种有效的方法来为不同的构建配置我的services.AddAuthentication(options =>
{
options.DefaultAuthenticateScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
options.DefaultChallengeScheme = IdentityServerAuthenticationDefaults.AuthenticationScheme;
}).AddIdentityServerAuthentication(AuthenticationRule.ConfigureForStaging());
//.AddIdentityServerAuthentication(AuthenticationRule.ConfigureForProduction());
而不使用大量令人讨厌的IfDefs。如果我要配置一个普通的类,我通常只会在Dependency Injector中交换一个组件,一切都会完成,但由于启动类用于配置DI,这是不可能的。
目前,我很难对以下内容进行编码:
const string connection = @"Server=StagingServer.com;Database=MyStagingDB;Trusted_Connection=True;";
//const string connection = @"Server=localhost;Database=MyLocalDB;Trusted_Connection=True;";
我有一堆语句注释掉代码库的吞吐量
def on_press(key):
global line
line += key
print(line)
这不是非常有效,并且肯定容易出错。如何配置我的启动类以使切换构建变得容易?
答案 0 :(得分:3)
这是一个想法。
public class Program
{
public static bool IsProduction = false; // shouldn't actually be hard coded.
public static void Main(string[] args)
{
var hostCommon =
new WebHostBuilder()
.UseKestrel()
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration();
var host =
IsProduction
? hostCommon.UseStartup<StartupProduction>()
: hostCommon.UseStartup<StartupStaging>();
host.Build().Run();
}
}
然后,您可以将公共部分放在某种Helper类中,并从每个Startup
类中调用每个Startup
类所需的任何部分。
如果您有两个以上的环境,则可以使用Dictionary<string, Type>
或Dictionary<string, Func<IWebHostBuilder, IWebHostBuilder>>
并键入环境名称。
或者,您可以使用Camilo Terevinto提到的基于会议的方法。 From Microsoft:
注入IHostingEnvironment的另一种方法是使用a 基于惯例的方法。该应用可以定义单独的启动 不同环境的类(例如,StartupDevelopment), 并在运行时选择适当的启动类。班级 其名称后缀与当前环境匹配的优先级。如果 该应用程序在开发环境中运行,并包含一个 Startup类和StartupDevelopment类,StartupDevelopment 使用了类。