2012-11-24 4 views
0

프로젝트에서 나는 로깅을 위해 프런트 엔드로 코드베이스의 어느 곳에서나 메시지를 보내고 사용자에게 표시하는 일반 메커니즘을 개발하려고합니다.모델에서 MVVM Light 참조 사용

오류/예외로 인해 진행 상황 등을보고 할 수있는 메시지가 전송 될 수 있습니다. 처음에는 log4net과 같은 메시지를 사용하여 메시지 데이터를보고 응용 프로그램 수준에서 이러한 메시지를 사용하고 표시 할 사용자 지정 appender가 있다고 생각했습니다/적절하게 기록하십시오. 그러나이 문제가 몇 가지 문제로 인해 최선의 방법이라고 확신하지 못합니다.

1) 프로젝트가 여러 개의 개별 어셈블리로 분할되어 있으며 여러 DLL에 걸쳐 log4net 구성에 문제가 있음을 확인했습니다 .

2)이 메시징 체계는 단순한 로깅이 아니므로 로깅 프레임 워크 사용이 너무 제한적일 수 있습니다.

현재 C# 사용자 지정 메시지 이벤트를 사용하여 어셈블리에서 데이터를 보내고이를 캡처하기 위해 응용 프로그램 수준에서 처리기를 등록합니다.

그러나 MVVMLight의 Messenger 클래스가 어셈블리에서 일반 데이터 패킷 (클래스)을 보내는 방법 인 것을 깨달았습니다. 그러나 모델 코드에서 메시지를 보낼 수 있기 때문에 모델 코드에서 MVVMLight에 불필요하게 의존성이 추가되는지 궁금합니다.

제 생각에 모델 코드는 수정없이 응용 프로그램 프레임 워크에 놓을 수 있도록 가능한 한 종속성이 없어야합니다.

너희들은 어떻게 생각하니?

답변

0

당신이하려고하는 것이면 Messenger 클래스를 사용해야합니다.

모델 코드가 다른 응용 프로그램에서 사용될 가능성이 얼마나 큽니까? 일반 (사용자 기본 설정, 보안 등)이라면 다른 곳에서 사용하고 싶지만 맞춤형 비즈니스 데이터를 제공하는 경우 YAGNI입니다.

좋은 관행의 관점에서 나는 이런 식으로 뭔가를하고 좋을 것 :

public interface IMessenger<T> 
{ 
    public void Send(T message); 
} 

public class MessengerProxy:IMessenger<ErrorDto> 
{ 
    public void Send(ErrorDto error) 
    { 
     Messenger.Default.Send(error); 
    } 
} 

public class AnotherModel 
{ 
    public AnotherModel(IMessenger<ErrorDto> errorRegister) 
    { 
     _errorRegister=errorRegister; 
    } 

    private RegisterError(Exception ex) 
    { 
     var dto=new ErrorDto(ex,"My Title"); 
     _errorRegister.Send(dto); 
    } 
} 

은 MVVM 빛의 MessengerProxy를 등록하고 모델 클래스의 생성자에 주입합니다. 위의 내 모델 클래스에서는 인터페이스를 생성자에 삽입합니다. 이렇게하면 Messenger에 액세스 할 수 있지만 나중에 필요할 경우 기본 구현을 변경할 수 있습니다.

+0

나는 그것에 대해 생각하지 않았지만 당신이 옳다고 생각합니다. 모델 코드는 일반적으로 재사용되지 않습니다. 깔끔한 해결책 나는 그것을 대답으로 받아 들였다. 답장을 보내 주셔서 감사합니다. – Darran

관련 문제