您是否从容器中获取 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>();
请注意,这仅在您通过直接调用容器(服务位置)来检索视图时才有效,因为它取决于“Root.RequestedType”。根据您计划获取视图的方式,您可能能够在 BuildStack 中寻找视图(而不是假设它始终是 Root)。