Реализация класса DDD Entity в C # - PullRequest
8 голосов
/ 24 февраля 2010

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

Какое самое подходящее решение?

Ответы [ 3 ]

18 голосов
/ 24 февраля 2010

Единственной характеристикой сущности является то, что она имеет долгоживущую и (полу) постоянную идентичность. Вы можете инкапсулировать и выразить это путем реализации 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
}
3 голосов
/ 24 февраля 2010

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

0 голосов
/ 24 февраля 2010

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...