2014-04-18 3 views
1

현재 Command가 Handler의 .Handle() 메소드에 대한 DTO 인 곳을 디자인하고있는 서비스의 Command-Handler Pattern을 구현 중입니다. 이 시점까지는 모두 똑바로되어 있지만 냄새에 관한 울타리에있는 구현 질문을 실행했습니다.명령 처리기 패턴의 중첩 DTO?

해당 CommandHandler에 필요한 추가 데이터를 사용하여 ICommand를 확장하는 인터페이스를 만들어야합니까 ... 또는 중첩 된 Dto 객체에 액세스하기 위해 ICommand 인터페이스에서 .Data 속성을 만들어야합니까?

옵션 # 1

public interface ICommand 
{ 
    Guid Id { get; set; } 
    string Name { get; set; } 
    CommandStatus Status { get; set; } 
    TimeSpan Elapsed { get; set; } 
} 

[KnownType(typeof (DeleteProjectLogCommand))] 
[DataContract(Name = "Command")] 
public abstract class CommandBase : ICommand 
{ 
    [DataMember] 
    public Guid Id { get; set; } 
    [DataMember] 
    public string Name { get; set; } 
    [DataMember] 
    public CommandStatus Status { get; set; } 
    [DataMember] 
    public TimeSpan Elapsed { get; set; } 
} 

public interface IDeleteProjectCommand : ICommand 
{ 
    long? ProjectId { get; set; } 
} 

[DataContract(Name = "DeleteProjectLogCommand")] 
public class DeleteProjectLogCommand : CommandBase, IDeleteProjectCommand 
{ 
    [DataMember] 
    public long? ProjectId { get; set; } 
} 

옵션 # 2

public interface ICommand 
{ 
    Guid Id { get; set; } 
    string Name { get; set; } 
    CommandStatus Status { get; set; } 
    TimeSpan Elapsed { get; set; } 
    DataDto Data { get; set; } 
} 

[KnownType(typeof(ProjectDto))] 
[DataContract(Name = "DataDto")] 
public abstract class DataDto 
{ 
    [DataMember] 
    long? Id { get; set; } 
    bool IsNew { get; set; } 
} 

public class ProjectDto : DataDto 
{ 
    public long? OrganizationId { get; set;} 
    public ProjectType ProjectType { get; set;} 
    // ...etc 
} 

[DataContract(Name = "DeleteProjectLogCommand")] 
public class DeleteProjectLogCommand : CommandBase 
{ 
    // ...in this instance no other data is needed, 
    // making this basically just an empty Decorator of CommandBase 
} 

번째 예는 작은 DRY'er이다, 그러나 그것은 오르게 DataContracts을 갖는 희생 온다 다른 경우보다 간결한 인터페이스에서 구현 된 추상 CommandBase의 지금은 비어있는 장식물들입니다.

답변

0

두 번째 옵션은 특수 명령을 사용하는 본질을 잃어 버렸다고 생각합니다. DeleteProjectLogCommand에서 CRUDCommand으로 이름을 바꿀 수 있습니다. 또한 많은 경우에는 ICommand에 일반 DataDto 페이로드를 도입하여 구현 기능을 제한하는 것이 좋습니다. 그리고 귀하의 ProjectDto은 귀하의 명령 속성이 무엇인지 돌보고 있습니다.

첫 번째 옵션을 계속 사용하겠습니다. 더욱 더 간단하게 유지하려면 IDeleteProjectCommand을 제거해야합니다.