DDD и Entity Base, модель с использованием нескольких типов идентичности - PullRequest
4 голосов
/ 03 мая 2010

У меня есть модель, которая выглядит так:

public interface IEntity
{
    int Id { get; set; }
}

Тогда идея состоит в том, чтобы мои объекты наследовали от этого интерфейса:

public class User : IEntity
{
    public int Id { get; set; }
}

Однако одна из моих сущностей фактически имеет идентификатор Guid в качестве идентификатора.

public class UserSession
{
    public Guid Id { get; set; }
}

Мне бы очень хотелось, чтобы все мои объекты наследовали от одного и того же интерфейса, но это заставило бы меня добавить столбец идентификаторов на основе целых чисел в UserSession, что не нужно, поскольку Guid - это идентификатор, но при этом модель домена будет хорошей, поскольку все объекты будет наследовать от той же базы.

Какие варианты у меня есть в этом сценарии? Могу ли я иметь два базовых интерфейса, один для int и один для Guid? Должен ли я добавить столбец идентификации в сущность UserSession, хотя это не нужно? Мне нужен Guid, поэтому я не могу просто избавиться от него и заменить его на целое число.

Есть мысли о лучших практиках?

Ответы [ 3 ]

3 голосов
/ 03 мая 2010

Вы, безусловно, можете реализовать один и тот же интерфейс IEntity во всех ваших сущностях и при этом иметь разные типы в каждом поле Id.

Введите Дженерики ..

определите ваш интерфейс следующим образом.

public interface IEntity<T>
{
    T Id { get; set; }
}

Реализация интерфейса в вашей сущности ..

public class User : IEntity<int>
{
    public int Id { get; set; }
}


public class UserSession : IEntity<Guid>
{
    public Guid Id { get; set; }
}
1 голос
/ 31 января 2011

Попробуйте это

public interface IEntity<T>
{
    T Id { get; set; }
}

public abstract class BaseEntity<T, U>
{
    U _id;
    public U Id
    {
        get { return _id; }
        set { _id = value; }
    }
}

А потом

public class Person : BaseEntity<Person,int>
{
    string _firstName;
    string _lastName;

    public string FirstName
    {
        get { return _firstName; }
        set { _firstName = value; }
    }

    public string LastName
    {
        get { return _lastName; }
        set { _lastName = value; }
    }
} 

или

public class City: BaseEntity<City,Guid>
{
    string _name;

    public string Name
    {
        get { return _name; }
        set { _name = value; }
    }

}       
0 голосов
/ 21 марта 2012

Всегда используйте Guid для идентификации объекта.

Направляющие имеют существенные преимущества по сравнению с целочисленными значениями в том, что они могут быть сгенерированы на клиенте, что освобождает вас от пакетных команд, отображает результат вставки в AJAX без запроса идентификатора и т. Д.

...