Obtenez-vous MyView (et BobsView) à partir du conteneur ? Pouvons-nous supposer qu'ils prendront tous une instance de IPrompt ?
Une approche consisterait à enregistrer tous vos validateurs avec un nom correspondant aux noms de vos vues. Vous pouvez implémenter votre propre analyseur de type qui supprime simplement le suffixe 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);
}
}
Maintenant, si vous supposez qu'un IPrompt sera toujours demandé par une vue qui suit cette convention de nommage, votre registre pourrait ressembler à ceci :
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>();
});
}
}
Pour récupérer votre vue avec le validateur approprié, vous devez demander le type concret :
var view = container.GetInstance<MyView>();
Notez que cela ne fonctionnera que si vous récupérez votre vue par un appel direct au conteneur (emplacement du service), puisque cela dépend du "Root.RequestedType". Selon la façon dont vous prévoyez d'obtenir vos vues, vous pourriez être en mesure de remonter la BuildStack à la recherche d'une vue (au lieu de supposer qu'il s'agit toujours de Root).