2014-04-18 45 views
1

我目前正在爲一個服務實現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的一些現在空白的裝飾,否則這些裝飾將從更簡潔的接口實現。

回答

0

我認爲第二個選項失去了專門命令的本質。您還可以將DeleteProjectLogCommand重命名爲CRUDCommand。此外,通過在ICommand中引入通用的DataDto有效載荷,您可能會限制實施的功能,順便說一句,在許多情況下可能不需要。而你的ProjectDto正在照顧你的命令屬性應該是什麼。

我會堅持你的第一個選擇。更重要的是,我可能會擺脫IDeleteProjectCommand以保持簡單。