Используя .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 использовать определенный поставщик / фабрику?