Ես ունեմ մեկ կախվածություն, որը գրանցված է հետևյալ կերպ.
interface IDependency { }
class DependencyImpl : IDependency { }
Գործարկում.
services.AddScoped<IDependency, DependencyImpl>();
Սա աշխատում է այնպես, ինչպես նախատեսված է, քանի որ ես ուզում եմ նորից օգտագործել նույն օրինակը իմ Web API հարցումների շրջանակում:
Այնուամենայնիվ, մեկ ֆոնային ծառայության մեջ ես կցանկանայի ասել, թե որ օրինակն այն կլուծի.
class MyBackgroundService
{
private readonly IServiceScopeFactory _scopeFactory; // set in ctor
public void DoStuff()
{
var itens = GetItens();
var dependencyInstance = new DependencyImpl();
Parallel.ForEach(itens, (item) =>
{
using(var scope = _scopeFactory.CreateScope())
{
scope.SwapDependencyForThisScopeOnly<IDependency>( () => dependencyInstance ); // something like this
var someOtherService = scope.ServiceProvider.GetRequiredService<ItemService(); // resolve subsequent services with provided dependencyInstance
someOtherService.Process(item);
}
});
}
}
Ես չեմ կարող կրկին օգտագործել նույն Scope-ը, քանի որ ItemService-ը (և/կամ դա կախվածություն է) օգտագործում է շրջանակի այլ ծառայություններ, որոնք հնարավոր չէ համօգտագործել: Ես չեմ ուզում փոխարինել կախվածության լուծումը ամբողջ հավելվածի համար:
Հնարավո՞ր է այստեղ անել այն, ինչ ուզում եմ: Արդյո՞ք դա իմաստ ունի:
Ես օգտագործում եմ dotnet core 2.2 լռելյայն IoC կոնտեյներով այդ հարցերի համար:
Խմբագրել ի պատասխան @Steven. DependencyImpl-ը պարունակում է կոնֆիգուրացիաներ, թե ինչպես է մշակվելու տարրը: Դրանցից մեկը ներառում է համեմատաբար թանկ հարցում: DependencyImpl-ը նույնպես ներարկվում է գրաֆիկում մեկից ավելի անգամ: Այսպիսով, ներկայումս այն կարդում է կոնֆիգուրացիան մեկ անգամ, պահում է դրանք մասնավոր հատկություններում և օգտագործում է քեշավորված տարբերակը հետագա ընթերցումների ժամանակ: Քանի որ ես գիտեմ, որ վերօգտագործելու եմ նույն կոնֆիգուրացիան այստեղ բոլոր տարրերի համար, ես կցանկանայի խուսափել կազմաձևումը կրկին կարդալուց յուրաքանչյուր զուգահեռ կատարման համար:
Իմ իրական աշխարհի կախվածությունն ավելի նման է հետևյալին.
interface IDependency
{
Task<Configuration> GetConfigurationAsync();
}
class DependencyImpl : IDependency
{
private readonly Configuration _configuration;
private readonly DbContext _dbContext;
ctor(DbContext dbContext)
{
_dbContext = dbContext;
}
public async Task<Configuration> GetConfigurationAsync()
{
if(_configuration is null)
{
// read configurations
}
return _configuration;
}
}
Ես հասկանում եմ, որ, ինչպես որ կա, իմ դասը թելերի համար անվտանգ չէ: Ես ստիպված կլինեի կարդալ սկզբում և/կամ ավելացնել թելի անվտանգությունը այստեղ:
Բացի այդ, այդ մշակումները նախկինում տեղի էին ունենում վեբ հարցման ողջ ընթացքում, և ֆոնային ծառայությունը նոր նյութ է: Ես կնախընտրեի հնարավորինս քիչ փոխել գոյություն ունեցող ծածկագիրը, քանի որ կան քիչ թեստեր և, իհարկե, ժամանակի սահմանափակումներ, որոնք կարող են լինել: