Вы получаете MyView (и BobsView) из контейнера? Можем ли мы предположить, что все они возьмут экземпляр IPrompt?
Один из подходов - зарегистрировать все ваши валидаторы с именем, которое соответствует названиям вашего представления. Вы могли бы реализовать свой собственный сканер типа, который просто удаляет Validator суффикса:
public class ValidatorScanner : ITypeScanner
{
public void Process(Type type, PluginGraph graph)
{
if (!typeof (IValidator).IsAssignableFrom(type)) return;
var validatorName = type.Name.Replace("Validator", "");
graph.AddType(typeof(IValidator), type, validatorName);
}
}
Теперь, если вы допускаете IPrompt всегда запрашиваться мнением, что следует, что соглашение об именах, реестр может выглядеть следующим образом:
public class ValidatorRegistry : Registry
{
public ValidatorRegistry()
{
Scan(scan =>
{
scan.TheCallingAssembly();
scan.With<ValidatorScanner>();
});
ForRequestedType<IPrompt>().TheDefault.Is.ConstructedBy(ctx =>
{
var viewName = ctx.Root.RequestedType.Name.Replace("View", "");
ctx.RegisterDefault(typeof(IValidator), ctx.GetInstance<IValidator>(viewName));
return ctx.GetInstance<GenericPrompt>();
});
}
}
чтобы получить свою точку зрения с соответствующим валидатор, вы должны запросить конкретный тип:
var view = container.GetInstance<MyView>();
Обратите внимание, что это будет работать только если вы retri вызывая свое мнение с помощью прямого вызова контейнера (местоположение службы), поскольку он зависит от «Root.RequestedType». В зависимости от того, как вы планируете получать свои взгляды, вы можете подойти к BuildStack, ищущему представление (вместо того, чтобы предполагать, что это всегда Root).
Имеет ли BobsView также зависимость от IPrompt? Если нет, у вас нет проблем. Если это так, вы можете посмотреть в профилях. – KevM