2017-11-08 22 views
0

구현 된 MVC 패턴이 있으며 오류 처리 및 사용자 거부 결정에 대해 생각하고 있습니다.MVC에서 사용자 상호 작용을 처리하는 C#

내 현재의 접근 방식은 다음과 같습니다 모든에 대해 만든 이벤트 후크를 decissiontype과 (내 경우에는 양식)에 GUI보기

내 질문 (콘솔 출력 또는 메시지 박스 같은) 특정 사용자 상호 작용을 만들어 보자 : 그것은 약간 이상하게 보입니다. 더 나은 접근 방법이 있습니까? 그렇지 않은 경우 클래스 UserDecission은 대부분의 사용자 상호 작용 사례를 처리하도록 어떻게 설계되어야합니까?

간단한 예 :보기 AskUser에 등록이 기술적으로 이벤트 아니기 때문에, 나는이 경우 EventHandler<T>를 사용하지 않을 SaveFile()

public class UserDecission 
{ 
    /// <summary> 
    /// Asked to the user, might be a placeholder constant, which the gui can make "pretty"(Display a MessageBox to the user) 
    /// </summary> 
    public string Question { get; set; } 
    /// <summary> 
    /// return value 
    /// </summary> 
    public string Answer { get; set; } 
} 
public interface IModel 
{ 
    void SaveFile(string filename); 
    EventHandler<UserDecission> AskUser { get; set; } 
} 
public class Model : IModel 
{ 
    public EventHandler<UserDecission> AskUser { get; set; } 
    public void SaveFile(string filename) 
    { 
     if (File.Exists(filename)) 
     { 
      UserDecission decission = new UserDecission() { Question = "FileExistsOverwrite" }; 
      AskUser?.Invoke(this, decission); 
      if (!decission.Answer.Equals("Yes")) 
       return; 
      //... Do the saving here 
     } 
    } 
} 

답변

0

를 호출하는 것이 아니라 사용자 정의 대리자 형식했습니다

public delegate string UserPromptHandler(string question); 

결과가 실제로 반환되고 불필요한 "발신인"등이 없으므로 코드가 더 명확 해집니다. 클래스 사용자가 클래스 c에서 처리기를 제공하도록 할 수도 있습니다 onstructor를 호출하여 핸들러가 있는지 확인하십시오.

+0

EventHandler에는 관찰자가 모델을 캐싱 할 필요가없는 기능이있어 보낸 사람을 IModel로 캐스팅하고 추가 컨텍스트 정보 (더 복잡한 경우)를 검색 할 수 있지만 사용자 지정 클래스를 사용하여 ' ''string'' 데이터 타입 : '''public delegate string UserPromptHandler (ComplexClass question);''' – FrankM