StructureMap IoC проблема получения экземпляра во время выполнения - PullRequest
0 голосов
/ 06 мая 2010

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

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

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

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

public ClassA(IWordTokensFilter stopWordsFilter, IWordTokensFilter categoryFilter)

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

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

1 Ответ

1 голос
/ 06 мая 2010

Существует несколько возможных решений:

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

public ClassA(IWordTokensFilter[] filters)

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

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>();
...