현재 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의 지금은 비어있는 장식물들입니다.