2010-02-24 2 views
8

Теперь я начинаю работать с DDD, я уже нашел хорошую реализацию для ValueObject, но я не могу найти какую-либо хорошую реализацию для Entities, я хочу получить общий тип базового объекта, который будет иметь идентификатор (необходимый по спецификации) и реализовать операции принудительного равенства.Внедрение класса сущности DDD в C#

Самое элегантное решение?

ответ

18

Единственная характеристика Сущности заключается в том, что она имеет долгоживущую и (полу) постоянную идентичность. Вы можете инкапсулировать и выразить это путем реализации IEquatable<T>. Вот один из способов сделать это:

public abstract class Entity<TId> : IEquatable<Entity<TId>> 
{ 
    private readonly TId id; 

    protected Entity(TId id) 
    { 
     if (object.Equals(id, default(TId))) 
     { 
      throw new ArgumentException("The ID cannot be the default value.", "id"); 
     } 

     this.id = id; 
    } 

    public TId Id 
    { 
     get { return this.id; } 
    } 

    public override bool Equals(object obj) 
    { 
     var entity = obj as Entity<TId>; 
     if (entity != null) 
     { 
      return this.Equals(entity); 
     } 
     return base.Equals(obj); 
    } 

    public override int GetHashCode() 
    { 
     return this.Id.GetHashCode(); 
    } 

    #region IEquatable<Entity> Members 

    public bool Equals(Entity<TId> other) 
    { 
     if (other == null) 
     { 
      return false; 
     } 
     return this.Id.Equals(other.Id); 
    } 

    #endregion 
} 
+0

Что вы подразумеваете под полупостоянием? – vorou

+0

+1. Это обычный подход для большого приложения? Вопрос, который я задал сегодня, вызывает критику подхода базового класса Entity: https://softwareengineering.stackexchange.com/questions/364870/should-i-handle-all-nine-comparisons?noredirect1_comment794683_364870. Однако для нас это работает очень хорошо. В одном из комментариев он был даже описан как анемичный. – w0051977

+0

@ w0051977 Я бы так не писал сегодня. Верно, что характеристика Entity заключается в том, что это тот же Entity, если он имеет одинаковый идентификатор, но реализация «Equals» не помогает в реальных базовых кодах. –

3

Для осуществления правильных операций равенства Я рекомендую взглянуть на базовый класс сущностей домена в Sharparchitecture - https://github.com/sharparchitecture/Sharp-Architecture/blob/master/Solutions/SharpArch.Domain/DomainModel/EntityWithTypedId.cs. Он реализует все необходимые функции. И посмотрите на другой код там, IMO, он будет очень полезен для вас и вашего дела.

0

Я не уверен, есть ли у вас конкретная библиотека/образец кода или рекомендации. Хорошее решение DDD будет использовать фабрику для создания экземпляра, постоянство, отделенное от модели домена (большинство ORM имеет тенденцию связывать их вместе), четко определяют границу домена, применяя поля и операции через интерфейс.

Я настоятельно рекомендую книгу Применяя книгу DDD и Patterns от Jimmy Nilson. В нем подробно обсуждается DDD и лучшие практики. Примеры также на C#, которые будут соответствовать вашему проекту.