У меня есть все oop, обрабатывающие "сообщения" из очереди. Дело в том, что каждый элемент очереди должен иметь свою собственную «область действия»
У меня сложилось впечатление, что именно это должна решить для меня фабрика области действия.
using (var scope = scopeFactory.CreateScope())
{
//Capture the scope..
var sp = scope.ServiceProvider;
//Set up the customer context here
//CurrentContext is registerd as scoped
//This will create a new instance of the object.
var cc = sp.GetService<CurrentContext>();
cc.AssetName = info.SourceName;
cc.Customer = info.CustomerGuid;
cc.Env = info.Env;
//and I'm setting the need values.
//Using the service provider generated from the scope factory
//to get my 'worker'
var worker = sp.GetService<TaskGeneratorWorker>();
await worker.CreateTasks(info);
}
В моей регистрации DI У меня есть что-то похожее на это.
services.AddHttpClient<Visavi_SF_REST_Endpoint_Helper>((sp, client) =>
{
//CurrentScope.ServiceProvider
var service = sp.GetService<ICustomerDataService>();
//Trying to get the "CurrentContex" set in the scope in the previouse snippet.
//This is now a 'new' instance of the CurrentContext and my values is 'lost'
var customer = sp.GetService<CurrentContext>();
});
Если я поставлю поставщика услуг, которого я создал на шаге 1, в глобальный параметр, и сошлюсь на то, что в обоих случаях он работает должным образом.
STEP 1:
globalSp = scope;
var cc = globalSp.ServiceProvider.GetService<CurrentContext>()
STEP 2:
var customer = globalSp.ServiceProvider.GetService<CurrentContext>();
Очевидно, что я неправильно понял, как это должно работать. Я подумал, что поставщик услуг отправил в services.AddHttpClient тот же «охват», что и родитель, который пытается создать его.