Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-core/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 解决方案中其他项目可以使用的项目中的依赖项注入_C#_Asp.net Core_Dependency Injection - Fatal编程技术网

C# 解决方案中其他项目可以使用的项目中的依赖项注入

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

我有一个visual studio解决方案,其中包括多个项目(Hosts.Project1、Hosts.Project2):

每个项目解决方案中的startup类如下所示:

        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);
  }
}