컨테이너에서 MyView (및 BobsView)를 가져오고 있습니까? 우리는 그들이 모두 IPrompt의 사례를 취할 것이라고 가정 할 수 있습니까?
한 가지 방법은 모든 유효성 검사기를보기 이름과 일치하는 이름으로 등록하는 것입니다.
: 당신이 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);
}
}
: 당신은 단지 검사기 접미사를 제거 자신의 형 스캐너를 구현할 수 당신이 retri 경우
var view = container.GetInstance<MyView>();
주
이 만 작동합니다 :
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>();
});
}
}
적절한 검증과보기를 검색하려면 구체적인 유형을 요청해야 "Root.RequestedType"에 의존하기 때문에 컨테이너 (서비스 위치)에 대한 직접 호출을 사용하여 뷰를 전달합니다. 뷰를 얻는 방법에 따라 뷰를 찾는 BuildStack을 걸어 갈 수 있습니다 (항상 루트라고 가정하는 대신).
BobsView도 IPrompt에 종속됩니까? 그렇지 않으면 문제가 없습니다. 그렇다면 프로필을 살펴 보는 것이 좋습니다. – KevM