C# 解决方案中其他项目可以使用的项目中的依赖项注入
我有一个visual studio解决方案,其中包括多个项目(Hosts.Project1、Hosts.Project2): 每个项目解决方案中的startup类如下所示:C# 解决方案中其他项目可以使用的项目中的依赖项注入,c#,asp.net-core,dependency-injection,C#,Asp.net Core,Dependency Injection,我有一个visual studio解决方案,其中包括多个项目(Hosts.Project1、Hosts.Project2): 每个项目解决方案中的startup类如下所示: public class Startup : FunctionsStartup { private IConfigurationRoot _configuration; public override void Configure(IFunctions
public class Startup : FunctionsStartup
{
private IConfigurationRoot _configuration;
public override void Configure(IFunctionsHostBuilder builder)
{
var serviceProvider = builder.Services.BuildServiceProvider();
var configurationRoot = serviceProvider.GetService<IConfiguration>();
var configurationBuilder = new ConfigurationBuilder();
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
configurationBuilder.AddConfiguration(configurationRoot);
configurationBuilder.AddAzureKeyVault($"https://{configurationRoot["keyVaultName"]}.vault.azure.net/", keyVaultClient, new DefaultKeyVaultSecretManager());
_configuration = configurationBuilder.Build();
builder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), _configuration));
builder.Services.AddSingleton<IARepo, ARepo>();
builder.Services.AddSingleton<IBRepo, BRepo>();
builder.Services.AddSingleton<ILogRepo, LogRepo>();
}
}
公共类启动:函数启动
{
专用IConfigurationRoot\u配置;
公共覆盖无效配置(IFunctionsHostBuilder)
{
var serviceProvider=builder.Services.BuildServiceProvider();
var configurationRoot=serviceProvider.GetService();
var configurationBuilder=new configurationBuilder();
var azureServiceTokenProvider=新azureServiceTokenProvider();
var keyVaultClient=新的keyVaultClient(
新建KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback);
configurationBuilder.AddConfiguration(configurationRoot);
configurationBuilder.AddAzureKeyVault($“https://{configurationRoot[“keyVaultName”]}.vault.azure.net/”,keyVaultClient,新的DefaultKeyVaultSecretManager());
_configuration=configurationBuilder.Build();
Replace(servicescriptor.Singleton(typeof(IConfiguration),_配置));
builder.Services.AddSingleton();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
}
}
这些项目解决方案中的每一个都需要“keyVaultName”,访问“LogRepo”。每个启动类中只有以下部分不同:
builder.Services.AddSingleton<IARepo, ARepo>();
builder.Services.AddSingleton<IBRepo, BRepo>();
builder.Services.AddSingleton();
builder.Services.AddSingleton();
如何创建一个新的项目解决方案(Hosts.ProjectCommon),其中包括一个公共启动类(使用keyVaultName,访问LogRepo)我可以从其他项目解决方案中引用这个公共启动类&重用公共启动类,只更新单个项目解决方案中的依赖项注入代码?我假设您有一个visual studio解决方案,其中包含多个单独的应用程序项目,类似于:
Solution
|__> Hosts.Project1 (requires <IARepo, A1Repo>)
|__> Hosts.Project2 (requires <IARepo, A2Repo>)
什么是“项目解决方案”?非常感谢!问题-1)目前我有注册课程和启动课程。是否可以避免注册器类而只使用启动类2)是否可以避免创建类的实例(var Registrator=new RegistratorApp1())?您还可以将“BaseRegistrator”重命名为“BaseStartup”(技术上不需要)并从这个基类派生Project1和Project2中的启动类。(这将删除ProjectXRegistrator类和使用“new Registrator…”创建的显式实例)
Solution
|__> Hosts.Project1 //(requires <IARepo, A1Repo>)
|__> RegistratorApp1 : BaseRegistrator
|__> Hosts.Project2 //(requires <IARepo, A2Repo>)
|__> RegistratorApp2 : BaseRegistrator
|__> Hosts.Base //(includes base configuration)
|__> BaseRegistrator
public class BaseRegistrator {
public BaseRegistrator(){}
private IConfigurationRoot _configuration;
public void Register(IFunctionsHostBuilder builder)
{
var serviceProvider = builder.Services.BuildServiceProvider();
var configurationRoot = serviceProvider.GetService<IConfiguration>();
var configurationBuilder = new ConfigurationBuilder();
var azureServiceTokenProvider = new AzureServiceTokenProvider();
var keyVaultClient = new KeyVaultClient(
new KeyVaultClient.AuthenticationCallback(
azureServiceTokenProvider.KeyVaultTokenCallback));
configurationBuilder.AddConfiguration(configurationRoot);
configurationBuilder.AddAzureKeyVault($"https://{configurationRoot["keyVaultName"]}.vault.azure.net/", keyVaultClient, new DefaultKeyVaultSecretManager());
_configuration = configurationBuilder.Build();
builder.Services.Replace(ServiceDescriptor.Singleton(typeof(IConfiguration), _configuration));
RegisterApplicationDependentServices(builder)
builder.Services.AddSingleton<ILogRepo, LogRepo>();
}
protected virtual void RegisterApplicationDependentServices(IFunctionsHostBuilder builder){
}
}
public class RegistratorApp1 : BaseRegistrator {
public RegistratorApp1(){}
protected override void RegisterApplicationDependentServices(IFunctionsHostBuilder builder){
builder.Services.AddSingleton<IARepo, A1Repo>();
builder.Services.AddSingleton<IBRepo, B1Repo>();
}
}
public class RegistratorApp2 : BaseRegistrator {
public RegistratorApp2(){}
protected override void RegisterApplicationDependentServices(IFunctionsHostBuilder builder){
builder.Services.AddSingleton<IARepo, A2Repo>();
builder.Services.AddSingleton<IBRepo, B2Repo>();
}
}
//startup of Hosts.Project1
public class Startup : FunctionsStartup
{
public override void Configure(IFunctionsHostBuilder builder)
{
var registrator = new RegistratorApp1();
registrator.Register(builder);
}
}