Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/282.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_.net_Asp.net Core_Dependency Injection - Fatal编程技术网

C# 如何进行适当的依赖注入

C# 如何进行适当的依赖注入,c#,asp.net,.net,asp.net-core,dependency-injection,C#,Asp.net,.net,Asp.net Core,Dependency Injection,我试图在一个webjob中进行依赖注入,但我有点困惑,我认为我做得不对 对于这个项目,我使用的是Azure认知搜索,为了让它工作,我需要在appsettings.json中设置一些变量 "APPINSIGHTS_INSTRUMENTATIONKEY": "MyKey", "AzureWebJobsServiceBus": "{SBEndoint}", "QueueToIndexDocumentsFrom": "{QueueToIndexDocumentsFrom}", "Sear

我试图在一个webjob中进行依赖注入,但我有点困惑,我认为我做得不对

对于这个项目,我使用的是Azure认知搜索,为了让它工作,我需要在appsettings.json中设置一些变量

  "APPINSIGHTS_INSTRUMENTATIONKEY": "MyKey",
  "AzureWebJobsServiceBus": "{SBEndoint}",
  "QueueToIndexDocumentsFrom": "{QueueToIndexDocumentsFrom}",
  "SearchServiceName": "{SearchServiceName}",
  "SearchServideAdminApiKey": "{SearchServideAdminApiKey}",
  "SearchServiceIndexClientDocuments": "{SearchServiceIndexClientDocuments}",
  "SearchServiceIndexJobDocuments": "{SearchServiceIndexJobDocuments}",
  "SearchServiceIndexBillCycleDocuments": "{SearchServiceIndexBillCycleDocuments}",
  "ConnectionStrings": {
    "AzureWebJobsStorage": "{StorageAccount}",
    "AzureWebJobsDashboard": "{StorageAccount}"
  },
对于其中一些变量,我需要实例化对象SearchClient和3个对象(SearchIndexClient),但在webjob的整个生命周期中,这只能执行一次

因此,我创建了以下代码:

  public interface IIndexer
    {
        SearchServiceClient CreateSearchServiceClient(IConfigurationRoot configuration);
        Task IndexClientDocument(ClientDocument document, ISearchIndexClient indexClientDocument);
        Task IndexJobDocument(JobDocument document, ISearchIndexClient indexJobtDocument);
        Task IndexBillCycleDocument(BillCycleDocument document, ISearchIndexClient indexBillCyckleDocument);
    }

 public class Indexer : IIndexer
    {
        private string searchServiceName;
        private string adminApiKey;
        private string index;
        ISearchIndexClient indexClientDocument;


        // Create the search service client
        public SearchServiceClient CreateSearchServiceClient(IConfigurationRoot configuration)
        {
            searchServiceName = configuration["SearchServiceName"];
            adminApiKey = configuration["SearchServiceAdminApiKey"];
            SearchServiceClient serviceClient = new SearchServiceClient(searchServiceName, new SearchCredentials(adminApiKey));
            indexClientDocument = serviceClient.Indexes.GetClient(configuration[""]);
            return serviceClient;
        }

        public Task IndexClientDocument(ClientDocument document, ISearchIndexClient indexClientDocument)
        {
            throw new NotImplementedException();
        }

        public Task IndexJobDocument(JobDocument document, ISearchIndexClient indexJobDocumnet)
        {
            throw new NotImplementedException();
        }

        public Task IndexBillCycleDocument(BillCycleDocument document, ISearchIndexClient indexBillCycleDocumnet)
        {
            throw new NotImplementedException();
        }
    }
然后在Program.cs中,我有以下内容:

 public class Program
    {
        private static IConfiguration Configuration { get; set; }
        static async Task Main(string[] args)
        {
            var builder = new HostBuilder();
            builder.ConfigureWebJobs(b =>
            {
                b.AddAzureStorageCoreServices();
                b.AddAzureStorage();
                b.AddTimers();
                b.AddServiceBus(sbOptions =>
                {
                    sbOptions.ConnectionString = Configuration["AzureWebJobsServiceBus"];
                });
            });

            builder.ConfigureServices((context, s) => { ConfigureServices(s); s.BuildServiceProvider(); });
            builder.ConfigureLogging(logging =>
            {
                string appInsightsKey = Configuration["APPINSIGHTS_INSTRUMENTATIONKEY"];
                if (!string.IsNullOrEmpty(appInsightsKey))
                {
                    // This uses the options callback to explicitly set the instrumentation key.
                    logging.AddApplicationInsights(appInsightsKey)
                            .SetMinimumLevel(LogLevel.Information);
                    logging.AddApplicationInsightsWebJobs(o => { o.InstrumentationKey = appInsightsKey; });
                }

            });
            var tokenSource = new CancellationTokenSource();
            CancellationToken ct = tokenSource.Token;
            var host = builder.Build();
            using (host)
            {
                await host.RunAsync(ct);
                tokenSource.Dispose();
            }
        }

        private static void ConfigureServices(IServiceCollection services)
        {
            var environment = Environment.GetEnvironmentVariable("ASPNETCORE_ENVIRONMENT");

            Configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json", optional: false, reloadOnChange: true)
                .AddJsonFile($"appsettings.{environment}.json", optional: true, reloadOnChange: true)
                .AddEnvironmentVariables() //this doesnt do anything useful notice im setting some env variables explicitly. 
                .Build();  //build it so you can use those config variables down below.

            Environment.SetEnvironmentVariable("QueueToIndexDocumentsFrom", Configuration["QueueToIndexDocumentsFrom"]);
            Environment.SetEnvironmentVariable("SearchServiceName", Configuration["SearchServiceName"]);
            Environment.SetEnvironmentVariable("SearchServideAdminApiKey", Configuration["SearchServideAdminApiKey"]);
            Environment.SetEnvironmentVariable("SearchServiceIndexClientDocuments", Configuration["SearchServiceIndexClientDocuments"]);
            Environment.SetEnvironmentVariable("SearchServiceIndexJobDocuments", Configuration["SearchServiceIndexJobDocuments"]);
            Environment.SetEnvironmentVariable("SearchServiceIndexBillCycleDocuments", Configuration["SearchServiceIndexBillCycleDocuments"]);

            #region RegisterServiceProviders
                services.AddSingleton(Configuration);
                services.AddScoped<Functions, Functions>();
                services.AddScoped<IIndexer, Indexer>();
            #endregion

        }
    }
公共类程序
{
专用静态IConfiguration配置{get;set;}
静态异步任务主(字符串[]args)
{
var builder=新主机生成器();
builder.ConfigureWebJobs(b=>
{
b、 AddAzureStorageCoreServices();
b、 AddAzureStorage();
b、 AddTimers();
b、 AddServiceBus(sbOptions=>
{
sbOptions.ConnectionString=配置[“AzureWebJobsServiceBus”];
});
});
ConfigureServices((context,s)=>{ConfigureServices;s.BuildServiceProvider();});
builder.ConfigureLogging(日志=>
{
字符串appInsightsKey=配置[“APPINSIGHTS_INSTRUMENTATIONKEY”];
如果(!string.IsNullOrEmpty(appInsightsKey))
{
//这将使用选项回调显式设置插装键。
logging.AddApplicationInsights(appInsightsKey)
.SetMinimumLevel(日志级别信息);
logging.AddApplicationInsightsWebJobs(o=>{o.InstrumentationKey=appInsightsKey;});
}
});
var tokenSource=new CancellationTokenSource();
CancellationToken ct=tokenSource.Token;
var host=builder.Build();
使用(主机)
{
等待host.RunAsync(ct);
tokenSource.Dispose();
}
}
专用静态void配置服务(IServiceCollection服务)
{
var-environment=environment.GetEnvironmentVariable(“ASPNETCORE_-environment”);
配置=新的ConfigurationBuilder()
.SetBasePath(目录.GetCurrentDirectory())
.AddJsonFile(“appsettings.json”,可选:false,reloadOnChange:true)
.AddJsonFile($“appsettings.{environment}.json”,可选:true,重载更改:true)
.AddenEnvironmentVariables()//这没有任何用处。请注意,我正在显式设置一些环境变量。
.Build();//构建它,以便可以使用下面的配置变量。
setEnvironment变量(“QueueToIndexDocumentsFrom”,配置[“QueueToIndexDocumentsFrom]”);
SetEnvironmentVariable(“SearchServiceName”,配置[“SearchServiceName]”);
setEnvironment变量(“SearchServidDeadMinaPiKey”,配置[“SearchServidDeadMinaPiKey]”);
setEnvironment变量(“SearchServiceIndexClientDocuments”,配置[“SearchServiceIndexClientDocuments”]);
SetEnvironmentVariable(“SearchServiceIndexJobDocuments”,配置[“SearchServiceIndexJobDocuments”);
setEnvironment变量(“SearchServiceIndexBillCycledDocuments”,配置[“SearchServiceIndexBillCycledDocuments”]);
#地区注册服务提供者
services.AddSingleton(配置);
services.addScope();
services.addScope();
#端区
}
}
如何创建以下实例:
SearchServiceClient和3 ISearchIndexClient放在一个地方,使代码更可读?

什么是独立注入。我第一次看到的是,什么是独立注射。我第一次看到我,,,,,,。。。。。。。