Как настроить StructureMap для предоставления двух отдельных экземпляров одного типа для двух аргументов?
У меня есть ситуация, когда конструктор класса требует двух экземпляров одного и того же конкретного типа, реализующих интерфейс. Это позволяет использовать "Задачи", чтобы запускать их параллельно, чтобы сократить время.
Код конструктора выглядит так:
public SomeUsingClass (ISomeDependency someDepOne, ISomeDependency someDepTwo) {}
Здесь у меня есть только один конкретный класс, который реализует ISomeDependency, который является SomeDependencyClass.
Когда я получаю экземпляр SomeUsingClass, я должен убедиться, что два аргумента указывают на отдельные экземпляры SomeDependencyClass. Это связано с тем, что когда экземпляры будут использоваться в рамках двух отдельных задач, их "состояния" не должны конфликтовать с другими.
Я попытался использовать именованные экземпляры ISomeDependency (назвал их "instanceOne" и "instanceTwo". Код выглядит следующим образом:
.For<ISomeDependency>().Add<SomeDependency>().Named("instanceOne");
.For<ISomeDependency>().Add<SomeDependency>().Named("instanceTwo");
... и затем использовал следующее для создания экземпляра класса using:
.For<SomeUsingClass>().Use<SomeUsingClass>()
.Ctor<ISomeDependency>("someDepOne")
.IsNamedInstance("instanceOne")
.Ctor<ISomeDependency>("someDepTwo")
.IsNamedInstance("instanceTwo");
Это приводит к следующей ошибке:
Экземпляр по умолчанию не зарегистрирован и не может быть автоматически определен для типа "ISomeDependency".
Я явно упомянул, чтобы использовать конкретный экземпляр с именем. Где я неправ?
1 ответ
Все, что вам нужно, это указать, что при регистрации в AlwaysUnique()
:
.For<ISomeDependency>().AlwaysUnique().Add<SomeDependency>().Named("instanceOne");
.For<ISomeDependency>().AlwaysUnique().Add<SomeDependency>().Named("instanceTwo");