C# 如何进行适当的依赖注入
我试图在一个webjob中进行依赖注入,但我有点困惑,我认为我做得不对 对于这个项目,我使用的是Azure认知搜索,为了让它工作,我需要在appsettings.json中设置一些变量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
"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放在一个地方,使代码更可读?什么是独立注入。我第一次看到的是,什么是独立注射。我第一次看到我,,,,,,。。。。。。。