Несколько интерфейсов .NET Core DIC#

Место общения программистов C#
Ответить
Anonymous
 Несколько интерфейсов .NET Core DI

Сообщение Anonymous »

Некоторые сервисы и их интерфейсы:

Код: Выделить всё

public class ServiceA: IServiceA
{}

public class ServiceB: IServiceB
{}

public class ServiceC: IServiceC
{}
У всех один и тот же метод

Код: Выделить всё

public Task ResetAsync(CancellationToken cancellationToken = default)
{
// Reset something
}
Для этого метода я создал интерфейс IResettable

Код: Выделить всё

public interface IResettable
{
Task ResetAsync(CancellationToken cancellationToken = default);
}
Затем я зарегистрировал все свои службы в DI следующим образом:

Код: Выделить всё

services.AddSingleton();
services.AddSingleton();
services.AddSingleton();
Теперь я могу использовать для своих сервисов два типа наследования:

Код: Выделить всё

IServiceA : IResettable
IServiceB : IResettable
IServiceC : IResettable
или

Код: Выделить всё

ServiceA : IServiceA, IResettable
ServiceB : IServiceB, IResettable
ServiceC : IServiceC, IResettable
И теперь я хочу вызвать ResetAsync из IResettable с помощью выражения cron для всех моих сервисов, примерно так:

Код: Выделить всё

public class ResetService(
IEnumerable services) : IResetService
{
private readonly IEnumerable _services = services;

public async Task DoWorkAsync(CancellationToken cancellationToken = default)
{
foreach (var service in _services)
{
await service.ResetAsync(cancellationToken);
}
}
}
Я могу добавить свои услуги следующим образом:

Код: Выделить всё

services.AddTransient();
services.AddTransient();
services.AddTransient();

services.TryAddSingleton();
и я могу вызвать для них ResetAsync в ResetService, но это не будут те службы, которые были зарегистрированы как IServiceA, IServiceB, IServiceC. Это будут новые экземпляры.
Итак, мои вопросы:
  • В чем глобальная разница между этими регистрациями:

    Код: Выделить всё

    services.AddSingleton();
    
    services.AddSingleton();
    
  • Какой тип наследования мне следует использовать и почему

    Код: Выделить всё

    ServiceA : IServiceA, IResettable
    
    // or
    
    ServiceA : IServiceA
    
    IServiceA : IResettable
    
  • И ГЛАВНЫЙ ВОПРОС: Как я могу зарегистрировать один и тот же экземпляр ServiceA как IServiceA и как IResettable (с использованием .Net Core DI) для использования IServiceA в других службах и использования IEnumerable в ResetService для вызова ResetAsync для всех IResettable услуги?


Подробнее здесь: https://stackoverflow.com/questions/792 ... interfaces
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»