2013-03-21 2 views
1

인터페이스를 지원하는 모델 바인더 공급자를 만드는 방법에 대한 블로그 게시물을 보았습니다.모델 MVC4의 인터페이스 바인딩

http://www.matthidinger.com/archive/2011/08/16/An-inheritance-aware-ModelBinderProvider-in-MVC-3.aspx

그러나 나는 실제 모델 바인더를 처리하는 방법으로 손실입니다.

내가 DefaultModelBinder을 상속 할 수 있다는 것을 알고 있지만 사용자 정의 모델 바인더에서 관련 콘크리트 클래스를 어떻게 작동합니까? CreateModel 함수에서이 작업을 수행합니까? 그렇다면 어떻게해야할까요?

예 내 인터페이스에 대한 구조와 클래스의 일부 :

ModelBinders.Binders.Add(typeof(IAnswerControlViewModel), new AnswerControlModelBinder()); 

var answerControlBinderProvider = new InheritanceAwareModelBinderProvider 
{ 
    { typeof (IAnswerControlViewModel), new AnswerControlModelBinder() } 
}; 
ModelBinderProviders.BinderProviders.Add(answerControlBinderProvider); 

:

public interface IAnswerControlViewModel : IQuestionAnswerControl 
{ 
... 
} 

public class AnswerControl<T> : IAnswerControlViewModel 
{ 
.. 
} 

public class AnswerCheckBox : AnswerControl<bool> 
{ 

} 

public class AnswerMultiLineText : AnswerControl<string> 
{ 
    [DataType(DataType.MultilineText)] 
    public override string Value { get; set; } 
} 

public class AnswerCheckBoxListModal: AnswerControl<AnswerMultiSelectListValueType> 
{ 
    public string ModalName { get; set; } 
} 

이것은 내가 블로그 게시물에서 예제를 사용하여 내에서 Global.asax에 가지고 바인딩 모델 목표는 작업에 게시하는 동안 MVC에 바인딩 모델을 만드는 방법을 알리는 것입니다.

public IList<IAnswerControlViewModel> AnswerControls { get; set; } 

답변

1

귀하의 문제를 바로 해결하려면 귀하의 솔루션은 Ninject과 같은 종속성 주입/반전 제어 프레임 워크를 사용할 수 있지만 therearemanyothers과 같은 제어 프레임 워크의 사용이 될 수 있습니다. 프레임 워크에 따라 인터페이스 클래스에서 구체 클래스로 매핑을 구성 할 수 있습니다.

그런 다음 당신이해야 할 같은 명령으로 구상 클래스를 해결한다 :

var concrete = IoCContainer.Resolve(ModelBindingContext.ModelType); 

그리고 모든 것이 자동적으로 작동합니다

var concrete = IoCContainer.Resolve<IAnswerControlViewModel>(); 

또는 유형이 변수에 저장되어있는 경우

.

+0

나는 이미 Ninject를 사용하고 있지만 이것을 모델 바인딩에 적용하는 방법을 모르겠습니다. 내 상황은 그 인터페이스를 사용하는 일반 AnswerControl 클래스와 동일한 AnswerControls 목록에있을 것으로 예상되는 AnswerControl 을 상속하는 클래스가 있기 때문에 상황이 좀 더 복잡해 보입니다. – Pricey

+0

지금까지이 기사를 보았습니다. http://msdn.microsoft.com/en-us/magazine/hh781022.aspx에는 내 상황을 처리하는 방법에 대해 조금 더 설명하는 예제 추상 모델 바인더가 있지만, 아직 나오지 않았습니다. 아직 해결책은 없다. – Pricey

+0

어느 시점에서 모델 바인더 (또는 IoC 컨테이너)에 바인딩 할 모델을 구성/알려야 할 것입니다. 여러 개의 동일한 구체적인 구현이있을 수 있으므로 어떤 모델이 맞는지 "짐작할"수 있다고 생각하지 않습니다. 어쩌면 당신은 하드 코딩되거나 구성된 사전을 갖고 싶고, 다시 매핑 할 타입을 기술 할 것인가? 당신의 삶을 훨씬 쉽게 만들어 줄 수 있습니다. 생각할 것 : – thmshd