>

내 생각은 응용 프로그램 전체에서 서비스 프록시를 노출/사용하지 말고 단일 클래스에서 모든 서비스 통신 (클라이언트 프록시 사용)을 연습하는 것입니다. 이것을 달성하기 위해 아래 클래스를 만들었습니다.-

namespace MyOrganization.EventSender
{
    using MyOrganization.EventSender.DTOs;
    using MyOrganization.EventSender.Proxy;
    using MyOrganization.EventSender.Utilities;
    using log4net;
    using Newtonsoft.Json;
    using System;
    using System.ServiceModel;
    using System.ServiceProcess;
    /// <summary>
    /// The User Session Detail Sender
    /// </summary>
    public class SessionDataSender : ISessionDataSender
    {
        private static readonly ILog log = LogManager.GetLogger(System.Reflection.MethodBase.GetCurrentMethod().DeclaringType);
        private SessionDataDTO _sessionDataDTO;
        public SessionDataSender(SessionDataDTO sessionDataDTO)
        {
            _sessionDataDTO = sessionDataDTO;
        }

        public bool Send()
        {
            try
            {
                Proxy.MessageProcessorProxy.SessionDetails sd = new Proxy.MessageProcessorProxy.SessionDetails();
                sd.ChangeTime = _sessionDataDTO.ChangeTime;
                sd.ChangeType = _sessionDataDTO.ChangeType;
                sd.Username = _sessionDataDTO.Username;
                sd.SessionId = _sessionDataDTO.SessionId;               
                log.Info($"Sending SessionEvent [{sd.ChangeType}] to Web-Srver.");
                var client = new Proxy.MessageProcessorProxy.MessageProcessorClient();
                var response = client.LogEventDetails(sd);
                Proxy.ProxyFactory.CloseProxy(client as ICommunicationObject);
                log.Info($"Web-Server Response: [{response.ResponseMessage}]. Reference: [ {JsonConvert.SerializeObject(sd)} ] ");
                return true;
            }
            catch (Exception ex)
            {
                log.Error($"Exception: [{ex.ToString()}]");
                return false;
            }
        }
    }
}

이제 내 질문은 :-

  • 모든 DTO를 프록시의 DataContract에 매핑하는 것이 좋습니까? 저의이 수업은 다른 DTO를 가진 더 많은 서비스 요청으로 성장할 것입니다.
  • SRP/디자인 패턴을 위반하지 않도록이 클래스를 어떻게 설계해야합니까?

  • 답변 # 1

    와이즈 비즈

    예, 자신의 도메인에 매핑하면 도메인에서 DTO 라이브러리를 분리하여 모듈성을 향상시킬 수 있습니다.

    와이즈 비즈 <올>

    사용자 정의 또는 기존 매핑 프레임 워크를 사용하여 흐름에서 보일러 플레이트 매핑 코드를 제거하십시오. 당신은

    Is it good to map every DTOs into Proxy's DataContract? As my this class will grow with more service calls with different DTOs.

    를 만들 수 있습니다  수업.

    보일러 플레이트 try-catch 블록을 리팩토링하기 위해 AOP 를 사용해보십시오. 당신은

    How this class should be architect so that it doesn't violate SRP/Design-patterns?

    를 만들 수 있습니다  수업.

    응답 개체가 필요하지 않습니다

    와이즈 비즈 사용  고객을 처분하기위한 차단

    Mapper 를 사용하지 마십시오 항상 LogEntryExitAndErrorAnnotation 일 때  예외가 발생하면 숨겨집니다.

    적응 :

    using
    
    
    (4) 참고 사항

    OP가 지적했듯이 폐기하면 근본 예외를 숨길 수 있습니다 .

    이를 피하기 위해 어댑터를 사용할 수 있습니다. T4 템플릿을 사용하여 모든 클라이언트에 대해 템플릿을 생성합니다.

    클라이언트 인터페이스 제공

    boolean
    
    

    아래 코드를 사용하여 최상의 예외 세부 정보를 얻을 수 있습니다. 작업 중에 오류가 발생하지 않으면 Dispose 오류가 발생하고 그렇지 않으면 집계 오류가 발생합니다.

    true
    
    
    [LogEntryExitAndErrorAnnotation] public void Send() { var sd = mapper.Map<Proxy.MessageProcessorProxy.SessionDetails>(_sessionDataDTO); // see notes below why to use an adapter using (var client = new MessageProcessorClientAdapter( new Proxy.MessageProcessorProxy.MessageProcessorClient())) client.LogEventDetails(sd); }

  • 이전 javascript - 대부분의 물을 담은 용기
  • 다음 java - 목표 합계를 가진 두 숫자 찾기