2015-07-03 41 views
1

的我已經看到了一些DDD的帖子確實書籍,其中實體類是由某種形式的基類的具有用於實體身份類型,泛型參數得出的:實體標識 - 使用字符串而非類型

public interface IEntity<out TKey> 
{ 
    TKey Id { get; } 
} 

public interface IComplexEntity<out TKey, in TEntity> 
{ 
    TKey Id { get; } 
    bool IsSameAs(TEntity entity); 
} 

//Object Definition 
public class TaxPayer : IComplexEntity<string, User> 
{ 
    ... 
} 

在弗農的實施領域驅動設計,特定類型的使用創建爲身份:

public class TaxPayerIdentity : Identity 
{ 
    public TaxPayerIdentity() { } 

    public TaxPayerIdentity(string id) 
     : base(id) 
    { 
    } 
} 

最近我一直在努力的事件總線外部聽衆的交流活動。該「問題」我是我需要一個通用的消息格式的事件信封發送:

public EventEnvelope 
{ 
    long EventStoreSequence; // from the event store 
    bool IsReplay; // if event store is replaying from position 0 of stream 
    object EventBeingSent; // this is the actual event, i.e. class  AddressChanged { string Old; string New; DateTime On; } 
    object IdentityOfSender; // this is the identity of the entity who raised the event 
} 

以上的IdentityOfSender是一個對象,但實際值將是stringintGuid等根據對象身份類型。

我的問題是爲什麼不簡單地使用字符串作爲身份?畢竟,Guids,整數,名稱,數字都可以表示爲字符串,並且它們可以很容易地與通用格式的字符串進行比較 - 這不僅會使EventEnvelope更易於使用字符串作爲通用格式,還會使實體更容易無需基類或特殊類型的句柄?

總之,爲什麼人們不推薦使用字符串作爲通用格式(或者我沒有見過),而是談論基類和通用類型的身份?

回答

1

因爲跨文化字符集中的字符串比較並不容易。可以與字符串進行比較的最近數據類型是GUID。但是甚至GUID可以有不同的字符串表示形式。

例如:

{FD49D6AE-019C-4118-B7D1-A4DA54E4474F}, 
fd49d6ae-019c-4118-b7d1-a4da54e4474f, 
FD49D6AE019C4118B7D1A4DA54E4474F 

所有這三個具有相同的GUID值,但不同的字符串比較。數字以千位分隔符/小數點格式差異而聞名。

此外,我相信身份的自定義類是提供明確的身份比較。例如:信用卡號碼的前六位數字wikipedia)中有一個六位數的髮卡行標識號(IIN)。也就是說,讓您在領域驅動設計中擁有更高的靈活性。是的,該設計阻止您使用「一勞永逸」數據類型。

但是,您可以通過對象映射使用外部總線的編碼解碼模型。這樣可以避免打破DDD,同時在外部總線上提供相同的格式。

除此之外,它是一個通用指南。而且軟件工程中的每一條準則都有優點和缺點。使用你認爲最合適,知道最好的一種,但要保持它在整個設計中的一致性。

1

實際上,使用類型幾乎沒有好處 - 您可以在任何編程語言中輕鬆使用字符串。

但有一個更微妙的優勢。字符串表示字符串,只是一個字符序列。你必須知道一些字符串實際上意味着其他東西的上下文。對你來說可能很清楚,但我們不是爲自己編寫代碼,而是爲將來的讀者編寫代碼。對其他人來說這很重要 - 日期是日期,ID是ID等。

此外,如果需要,稍後擴展/重構某些特定ID類型會容易得多。