2012-01-04 3 views
2

, 즉 사용자 상호 작용 (윈폼을 포함하여, 인증의 전 과정을 포함하는 하나의 방법하나의 방법으로 사용자 상호 작용을 캡슐화하는 방법은 외부 프레임 워크를 사용하고

bool Authenticate(); 

와 인터페이스를 정의). 내가 뭘하고 싶은 이제

bool Authenticate() 
{ 
    bool succeeded = false; 
    bool userCancelled = false; 
    while(!succeeded && !userCancelled) 
    { 
    var credentials = AskTheUserForCredentials(); // this needs to wait for user input before returning! 
    if (credentials == null) 
     userCancelled = true; 
    else 
     succeeded = AuthenticateWithAnExternalServer(credentials); 

    if (!succeeded) 
     ShowErrorMessage(); 
    } 
    return succeeded; 
} 

쉬운 방법 같은 것을 AskTheUserForCredentials()ShowErrorMessage()()가 내부 Form.ShowDialog를 사용하는 것입니다 구현하는 것입니다. 실제 인증 프로세스에서 대화 상자가 사라지고 새로운 클릭 투 클릭 대화 상자에 오류 메시지가 나타나기 때문에 이는 매우 나쁜 사용자 환경입니다.

나는 하나의 형식으로 모든 내용을 표시하고, 보이는 상태로 유지하며, 텍스트 상자/단추를 적절히 비활성화하고 오류 메시지 만 표시합니다. 이 단일 메서드 호출을 차단하면 어떻게 될까요?

UPDATE

가장 좋은 방법은 지금까지 AskTheUserForCredentials() 내부 메시지 펌프를 구현하는 것입니다 :

Credentials AskTheUserForCredentials() 
{ 
    while(NeitherOkNorCancelPressed()) 
    { 
     Application.DoEvents(); 
     Thread.Sleep(10); // Standard Sleep(0) results in 100% procesor core usage. 
    } 
    return CreateCredentialsFromTextboxesEtc(); 
} 

지금 우리 모두가 메시지 펌프가 깨끗한 거리가 멀다 알고있다. 정확히이 솔루션은 얼마나 나쁜 것입니까? 더 나은 점이 있나요?

UPDATE 메시지 펌프는 몇 가지 함정이 있었다 2

:

  • 화이트 UIAutomation

으로 몹시 느린 추한 아니라 완전히 CPU의 효율적인

  • 작업 인

    끝 모든 프로세스를 ChrisBD와 같은 대화 상자에 위임했습니다 (대화 상자는 궁극적 인 성공 또는 실패 후에 만 ​​닫힙니다). IoC를 사용하여 GUI에서 인증을 추상화하는 데 더 많은 시간이 걸렸지 만 결국은 깨끗하고 의도 한대로 작동합니다.

  • +0

    do'AskTheUserForCredentials()'와'ShowErrorMessage()'는 별개의 양식이어야하며, 기본 폼 내에서 패널로 만들어 주시겠습니까? – StaWho

    +0

    나는 그들이 같은 형식을 사용하기를 바랍니다. –

    +0

    'Authenticate' 메쏘드로 폼을 생성하고 그것을'AskTheUser ...'와'ShowErrorMessage' 메쏘드의 매개 변수로 전달할 수 없었습니까? –

    답변

    1

    나는 거의 다 왔다고 생각한다.

    사용자 입력 컨트롤이있는 모달 대화 상자를 표시하고 필요할 때 해당 대화 상자에서 Authenticate 메서드를 호출하도록합니다.

    그런 다음 대화 상자가 닫히고 실제로 오류 메시지가 표시되는 위치를 선택할 수 있습니다.

    모달 대화 상자 클래스의 속성에 인증 성공 여부가 표시되도록합니다. 대화 상자 클래스 (모달로 열기 전에 주 응용 프로그램에 의해 인스턴스화 된)를 닫으면 주 응용 프로그램이 계속 실행됩니다. 그런 다음 적절한 대화 클래스 속성을 확인하여 인증이 성공했는지 여부를 확인할 수 있습니다.

    * 여기에 편집 *

    당신이 인증합니다 방법을 직접 구현하는 경우는 다음는 (앞서 언급 한 바와 같이) 오히려 기본 응용 프로그램보다 모달 대화 상자를 호출하는이 기능이다.사용자 지정 양식 클래스는 모든 인증 논리를 실행하고 사용자 상호 작용 컨트롤을 오류 메시지와 함께 표시 할 수 있습니다. 최소화 및 닫기 버튼을 제거하고 인증 프로세스의 성공 또는 실패를 나타내는 클래스 속성을 설정해야합니다.

    호출 프레임 워크는 인증 메소드의 반환 값을 기다립니다.

    +0

    아마도 나는 명확하지 않았습니다. 나는 Authenticate를 부르지 않을 것이다. 그것은 변경할 수없는 프레임 워크에 의해 호출됩니다. 이것은 정확히 한 번 호출되며 사용자 상호 작용이있는 전체 프로세스가 있어야합니다. –

    +0

    그럼 Authenticate 메소드를 구현하고 있습니까? 그에 따라 내 대답을 바꿀 것입니다. – ChrisBD

    +0

    외부 서버를 인증 용으로 사용하기 때문에 모달 대화 상자에서 비동기 적으로 호출하여 응용 프로그램을 응답 가능하게하십시오. 예를 들어 [Async CTP] (http://msdn.microsoft.com/en-us/vstudio/gg316360) 또는 일부 [표준 패턴] (http://msdn.microsoft.com/en-us/library)를 사용할 수 있습니다. /ms228969.aspx). –