Как я могу зарегистрировать и выполнить поиск по произвольному количеству классов, используя внедрение зависимостей?C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Как я могу зарегистрировать и выполнить поиск по произвольному количеству классов, используя внедрение зависимостей?

Сообщение Anonymous »

Я пытаюсь решить архитектурную проблему, связанную с гигантским устаревшим файлом с несколькими массивными операторами переключения, которые необходимо разбить на отдельные классы. Я хочу решить эту проблему, имея один (и минимальный) общий интерфейс для реализации многих обработчиков, используя значение перечисления, чтобы идентифицировать каждый обработчик и зарегистрировать их все для внедрения зависимостей в словаре.
Вероятно, это неправильно сформулировано, поэтому вот произвольный пример:

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

// Example enum
public enum Color
{
Green = 1,
Blue = 2,
Red = 3,
// Over a hundred more options
}

// Example interface for all handlers to implement using a generic parameter
public interface IColorHandler
{
Task GetContent(GeneralParamsObject info);
}
// Or, using a public property
public interface IColorHandler
{
Color HandledColor;
Task GetContent(GeneralParamsObject info);
}

// Example implementation specifically for the color green
public class GreenHandler : IColorHandler
{
public const Color HandledColor = Color.Green;
public Task GetContent(GeneralParamsObject info)
{
// Build content for green
}
}
Затем в «главный» сервис я хотел бы внедрить что-то вроде словаря, где ключи являются членами перечисления, что позволит коду динамически получать правильную конкретную реализацию.

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

public class ColorContentService : IColorContentService
{
private readonly IDictionary _handlers;

public ColorContentService(IDictionary handlers)
{
_handlers = handlers;
}

public async Task GetColorsContent(List colors)
{
var info = BuildInfoObject();
var content = new StringBuilder();
foreach (var color in colors)
{
if (_handler.TryGetValue(color, out var handler))
{
content.AppendLine(await handler.GetContent(info));
}
}
return content.ToString();
}
}
Для этого мне нужно будет создать и зарегистрировать этот словарь в контейнере IServiceCollection, но я начинаю задаваться вопросом, возможно ли это вообще. Я знаю, как зарегистрировать список классов на основе интерфейса в IEnumerable, но я бы предпочел использовать словарь, поскольку вариантов будет очень много, и мне бы не пришлось снова и снова перебирать всю коллекцию, чтобы найти правильная реализация.
Например, вот что мы сейчас делаем для определенных классов с общим интерфейсом:

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

serviceCollection.Scan(scan => scan.FromAssemblies(AppDomain.CurrentDomain.GetAssemblies())
.AddClasses(classes => classes.AssignableTo())
.As()
.WithScopedLifetime());
Это приводит к возможности внедрить IEnumerable и выполнить итерацию, чтобы вызвать метод и получить тот, который нам нужен. Но в тех случаях, когда мы сейчас используем это, существует максимум 10 реализаций, и нам нужно получить только одну из них для каждого запроса. Это новое решение будет включать более сотни, и для каждого запроса может потребоваться произвольное их количество. Возможно, есть способ сделать это без использования словаря, но на этом мои знания заканчиваются.
Итак, есть ли способ сделать то, что я надеюсь? Если у Google есть ответы, я понятия не имею, что искать, чтобы найти это, и чтение документации Microsoft пока ничего не дало.
О, и мы на .NET. 6, поэтому некоторые новые функции в данный момент могут быть нам недоступны.
Я еще ничего не пробовал реализовать – все еще на стадии планирования, но я копался в документации и еще не загорелась лампочка.

Подробнее здесь: https://stackoverflow.com/questions/785 ... sing-depen
Реклама
Ответить Пред. темаСлед. тема

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

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

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

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

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

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