Nano Hash - криптовалюты, майнинг, программирование

Проблема StructureMap IoC с получением экземпляра во время выполнения

У меня есть 2 конкретных типа «CategoryFilter» и «StopWordsFilter», которые реализуют «IWordTokensFilter».

Ниже моя установка:

ForRequestedType<IWordTokensFilter>().TheDefaultIsConcreteType<CategoryFilter>()
            .AddInstances(x =>
            {
                x.OfConcreteType<StopWordsFilter>();
            }
        );

Проблема заключается во времени выполнения, когда карта структуры автоматически вводит ее в мой класс, т.к. у меня есть аргументы с тем же типом плагина:

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter)

я всегда получаю CategoryFilter в своем первом аргументе, но это должен быть stopWordsFilter.

Как я могу настроить это правильно? заранее спасибо


Ответы:


1

Существует ряд возможных решений:

1) Должен ли ClassA различать фильтры или просто нужно запускать их оба? Если нет, вы можете изменить конструктор так, чтобы он принимал массив, что приведет к внедрению всех зарегистрированных экземпляров IWordTokensFilter:

public ClassA(IWordTokensFilter[] filters)

Затем вы можете использовать фильтры foreach для их применения.

2) Если вам нужно различать их, потому что они должны использоваться по-разному, вы можете рассмотреть возможность реализации одного интерфейса маркера, который лучше описывает его назначение. Затем ClassA можно было бы изменить, чтобы он принимал IWordTokensFilter и ICategoryFilter (или то, что вы называете интерфейсом маркера). Зарегистрируйте CategoryFilter с помощью ICategoryFilter, и тогда оба будут введены правильно.

public ClassA(IWordTokensFilter stopWordsFilter, ICategoryFilter categoryFilter)

3) Вы можете явно указать StructureMap, как создать ClassA:

ForRequestedType<ClassA>().TheDefault.Is.ConstructedBy(c => {
  return new ClassA(c.GetInstance<StopWordsFilter>(), c.GetInstance<CategoryFilter>());
});

4) Вы можете указать StructureMap переопределить одну из зависимостей для ClassA:

x.ForRequestedType<ClassA>().TheDefault.Is.OfConcreteType<ClassA>()
  .CtorDependency<IWordTokensFilter>("stopWordsFilter").Is<StopWordsFilter>();
06.05.2010
  • Привет, Джошуа, я очень доволен твоими ответами. Я хотел бы выбрать решение 1, но у меня много фильтров. Итак, я решил использовать 3 или 4. Кстати, будет ли структурная карта автоматически вводить все конкретные типы в аргументы массива в вашем решении 1? .. Еще раз большое спасибо. 07.05.2010
  • Да, он автоматически внедрит все известные ему конкретные экземпляры. Вы можете сообщить об экземплярах явно, используя AddInstances (как в вашем примере), или вызвать AddAllTypesOf в Scan. 07.05.2010
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..