2015-07-03 57 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类型会容易得多。

相关问题