2012-11-07 2 views
0

ASP.NET MVC 4에서 이벤트 메시지 묶음을 수신 대기하도록 게시 작업을 만들어야합니다. 많은 이벤트가 있으므로 이벤트 당 작업을 만들 수 없습니다. 따라서 게시 된 모델은 이벤트를 수화하기 위해 사용자 정의 모델 바인더를 사용하므로 기본 클래스로 작업을 만드는 것이 가장 좋습니다. 상속 기반 사용자 지정 모델 바인딩

이벤트의 일부

는 다음과 같습니다 :

public class QueryID : Identity<Guid> 
{ 
    public QueryID(Guid id) 
    { 
     Identifier = id; 
    } 
} 

public class QueryEvent : IEvent<QueryID> 
{ 
    public QueryEvent(QueryID id) 
    { 
     Identity = id; 
    } 

    #region Implementation of IEvent<out QueryID> 

    public QueryID Identity { get; private set; } 

    #endregion 
} 

public class QueryCreated : QueryEvent 
{ 
    public string ConnectionID { get; private set; } 

    public QueryCreated(QueryID id, string connectionID) 
     : base(id) 
    { 
     ConnectionID = connectionID; 
    } 
} 

public class ColumnAdded : QueryEvent 
{ 
    public string Column { get; private set; } 

    public ColumnAdded(QueryID id, string column) 
     : base(id) 
    { 
     Column = column; 
    } 
} 

과 같이 보일 것입니다 이러한 메시지를 수신 할 수있는 조치 방법 :

[HttpPost] 
    public ActionResult Index(IEvent<IIdentity> e) 
    { 
     // whatever 

     return new EmptyResult(); 
    } 

기본 신원 클래스는 IEvent<IIdentity> 인터페이스를 구현합니다.

모델 바인더는 어떻게 되나요?

고마워요

답변

1

단순한 모델 바인딩은 여기에 도움이되지 않습니다. 모델 바인딩이 작동하는 방식은 프레임 워크가 예상하는 매개 변수의 유형을보고 리플렉션을 사용하여 해당 유형의 기본 인스턴스를 만들고 양식에서 보낸 데이터를 사용하여 모든 공용 속성을 해 둡니다.

작업의 매개 변수가 인터페이스이므로 프레임 워크가 인스턴스를 만들지 못합니다. 그것은 만들 인터페이스의 구현을 알지 못합니다.

한 예로, 인터페이스의 구현이 작업 매개 변수에 바인딩되도록 표시하기 위해 게시되는 양식에 숨겨진 필드를 사용했습니다. 그러나 나는 간단한 시나리오를 가지고 있었다. 두 개의 구현이있는 하나의 인터페이스. 각각 하나의 양식에 해당합니다. 그래서 숨겨진 파일을 만들어 내 모델 바인더가 만들고자하는 클래스의 이름을 말해 줄 수 있습니다.

이벤트 발생 자 (내가 생각하는 일부 클라이언트 응용 프로그램)가 호출해야하는 모델을 알고있는 경우 해당 정보를 다른 정보와 함께 조치에 전송할 수 있습니다.

불행히도 지금은 코드가 없습니다. 이 솔루션이 도움이된다고 생각한다면 코드를 파헤쳐 볼 수 있습니다.

+0

안녕하세요 Suhas, 맞습니다. 매우 복잡한 시나리오입니다. 당신이 제안한 비슷한 해결 방법에 대해서 생각했지만 클라이언트가 서버 측의 구현 세부 사항을 "알지"못하게합니다. JSON에서 알려진 명령을 보내면이 사용자 정의 모델 바인더는 마술을 작동시킵니다. –

+0

클라이언트가 보낼 명령을 알고 있다면 (json이라고하더라도) 본질적으로 필요한 정보가 있습니다. 다른 방법이 없다고 생각합니다. – Suhas

+0

클라이언트가이 작업에 대한 JSON 직렬화 버전 하나를 보내면이 사용자 정의 모델 바인더는 해당 JSON을 명령 개체로 deserialize 할 수 있어야합니다. 모델 바인더는 속성을 시작하고 속성을 매핑 할 유형을 어떻게 알 수 있습니까? 예를 들어 CreateQuery 명령을 보내고 있습니다. JSON은 {Idendity : {Identifier : "some id"}, ConnectionID : "some connection"}처럼 보입니다.이 JSON에는 형식 정보가 없습니다. 동적 인 객체를 사용한다고해도 그것은 중요하지 않습니다. 유형을 알지 못합니다. 계속 .... –

0

MVC3 +의 인터페이스를 지원하는 사용자 정의 모델 바인더 공급자를 작성할 수 있습니다.이 게시물을 참조하십시오.

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

특정 인터페이스를 상속하는 모든 종류의

는 다음 가능성이 실제의 형태가 무엇인지 알아 .. 내가 노력하지 않은 as ConcreteClass 및 null 체크를 시도 할 수 있습니다 관련 모델 바인더에 전달 이것은 비슷한 문제가있어서 해결 방법을 찾을 수 없기 때문에 관련 게시물이 올바른 방향으로 향하는 것처럼 보입니다.

관련 문제