您是否從容器獲取MyView(和BobsView)?我們可以假設他們都會採用IPrompt的實例嗎?
一種方法是將所有驗證器註冊爲與您的視圖名稱匹配的名稱。你可以實現自己的型掃描儀,只是刪除了驗證後綴:
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 2009-10-28 02:55:04