.NET core - внедрение различных реализаций сервисов - PullRequest
0 голосов
/ 22 октября 2019

Используя .NET Core 2.2, у меня есть набор служб, которые вызывают SecurityService для выполнения проверок авторизации («зарегистрирован ли пользователь и имеет ли он / она требуемые разрешения?»). У меня проблема в том, что эти службы также вызываются HostedService, который (1) не имеет зарегистрированного пользователя и (2) не требует авторизации, поскольку это внутренний процесс с полными разрешениями.

Чтобы указать его вдругой способ:

  • вызовы ServiceA (по DI) SecurityService
  • вызовы ServiceB (по DI) SecurityService
  • вызовы HostedService (через IServiceScopeFactory) ServiceA и ServiceB.

Моя цель заключается в том, чтобы SecurityService вел себя по-разному при вызове ServiceA / B (-> выполнять проверки авторизации) по сравнению с вызовом HostedService (-> do not выполнение авторизациичеки). Я думал о чем-то вроде:

services.AddScoped<IServiceA, ServiceAImpl>();
services.AddScoped<IServiceB, ServiceBImpl>();

services.AddScoped<ISecurityService, SecurityServiceImpl>(); // Implementatation that performs checks

services.AddHostedService<MyHostedService>( ??? => <ISecurityService, DifferentSecurityServiceImplThatDoesntCheckPermissions> ) 

Возможно ли вышеизложенное? В противном случае мне нужно создать другой ServiceProvider для HostedService, который имеет доступ к той же ServiceA и ServiceB, но с другой SecurityService?

securedServiceCollection.AddScoped<IServiceA, ServiceAImpl>();
securedServiceCollection.AddScoped<IServiceB, ServiceBImpl>();
securedServiceCollection.AddScoped<ISecurityService, SecurityServiceImpl>();
ServiceProvider securedServiceProvider = ...

internalServiceCollection.AddScoped<IServiceA, ServiceAImpl>();
internalServiceCollection.AddScoped<IServiceB, ServiceBImpl>();
internalServiceCollection.AddScoped<ISecurityService, DifferentSecurityServiceImplThatDoesntCheckPermissions>();
internalServiceCollection.AddHostedService<MyHostedService>();
ServiceProvider unsecuredServiceProvider = ...

Но тогда, когда я внедряю SecurityService, какой ServiceProvider будет использоваться? Должен ли я предоставить пользовательскую реализацию IServiceScopeFactory ... но опять же, как я могу сказать HostedService использовать определенный поставщик / фабрику?

...