Вы не говорите точно, что именно за исключением того, что вы наблюдали в стратегии # 2, но я бы использовал этот подход (учитывая ваши другие требования для возможности другой инициализации после успешного разрешения всех зависимостей). Я подозреваю, что проблема в том, что вы не предоставляете «значение» для всех аргументов конструктора ... InjectionConstructor
предполагает, что вы хотите, чтобы конструктор соответствовал типам значений, предоставленных InjectionConstructor
.
например. если вы хотите зарегистрировать конструктор для такого класса ...
public class AudioChannelViewModel {
public AudioChannelViewModel(Channel channel, Dep1 dep1, Dep2 dep2, Dep3 dep3) {
...
}
}
Вы должны зарегистрировать его таким образом ...
container.RegisterType<AudioChannelViewModel>("left",
new InjectionConstructor(Channel.Left,
typeof(Dep1), typeof(Dep2), typeof(Dep3)));
container.RegisterType<AudioChannelViewModel>("right",
new InjectionConstructor(Channel.Right,
typeof(Dep1), typeof(Dep2), typeof(Dep3)));
Unity будет использовать предоставленное значение для первого аргумента (значение перечисления Channel
) и затем разрешит экземпляры Dep1
, Dep2
и Dep3
. Вы также можете использовать ResolvedParameter<T>
в качестве аргумента для InjectionConstructor
, если вам нужны конкретные именованные экземпляры Dep1
, Dep2
или Dep3
, которые вам требуются.
Недостаточно просто указать Channel.Left
или Channel.Right
, поскольку Unity будет считать, что его просят использовать конструктор с аргументом Channel
.
Или; если вы уже пробовали это, и это не работает ... возможно, Unity не поддерживает перечисления в этом случае (каламбур предназначен).
Эта страница MSDN может пролить дополнительный свет на проблему.