我目前正在爲一個服務實現Command-Handler模式,我正在設計Command的基本上是Handler的.Handle()方法的DTO。到目前爲止,這一切都是非常直接的,但我遇到了一個實現問題,讓我對它的嗅覺有了一些瞭解。命令處理程序模式中的嵌套DTO?
我應該創建接口來擴展ICommand與他們相應的CommandHandler所需的額外的特定數據......還是應該在ICommand接口上創建一個.Data屬性來訪問嵌套的Dto對象?
選項#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的一些現在空白的裝飾,否則這些裝飾將從更簡潔的接口實現。