Это может быть немного сложно, если вы полагаетесь на StructureMap для автоматического разрешения зависимостей. Первое решение (и к чему я бы ошибался) - это использовать интерфейсы маркеров, которые Ричард упоминает в своем ответе, а затем просто зарегистрировать их. Затем вы можете явно указать, хотите ли вы, чтобы ваш клиент или основной контекст были там.
Второй способ - использовать именованные регистрации, а затем явно указывать параметры конструктора.
ForRequestedType<IContext>().AddInstances(
i => {
i.OfConcreteType<ClientContext>().WithName("Client");
i.OfConcreteType<MasterContext>().WithName("Master");
});
ForRequestedType<SomeController>().TheDefault.Is.ConstructedBy(
i => new SomeController(i.GetInstance<ISomeService>(),
i.GetInstance<IClientRepository>(),
i.GetInstance<IContext>("Master"),
i.GetInstance<IContext>("Client")));
Не особенно хорошо, но он делает свою работу и, в конечном счете, если он находится только в одном или двух местах, он может быть в порядке.
Если вы хотите по-разному разрешить пространство имен / сборку, вы можете попробовать что-то вроде этого: -
ForRequestedType<IContext>().AddInstances(
i => {
i.OfConcreteType<ClientContext>().WithName("Client");
i.OfConcreteType<MasterContext>().WithName("Master");
}).TheDefault.Is.Conditional(c => {
c.If(con => con.ParentType.Namespace.EndsWith("Client"))
.ThenIt.Is.TheInstanceNamed("Client");
c.If(con => con.ParentType.Namespace.EndsWith("Master"))
.ThenIt.Is.TheInstanceNamed("Master");
c.TheDefault.Is.OfConcreteType<ClientContext>();
});
Где предикат для ParentType может ссылаться на Assembly (или как вам угодно)