DDD和实体库,使用多种身份类型的模型

时间:2010-05-03 14:39:54

标签: domain-driven-design

我的模型看起来像这样:

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 个答案:

答案 0 :(得分:3)

您当然可以在所有实体中实现相同的IEntity接口,并且每个Id字段中仍然有不同的类型。

输入Generics ..

像这样定义你的界面。

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 :(得分:1)

试试这个

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; }
    }

}       

答案 2 :(得分:0)

始终使用Guid来识别实体。

Guid与int相比具有明显的优势,因为它们可以在客户端生成,从而可以将您释放到批处理命令,在AJAX中显示插入的结果而无需查询ID等。