Domain driven design DDD和实体库,使用多种标识类型的模型

Domain driven design DDD和实体库,使用多种标识类型的模型,domain-driven-design,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; } } 我真的希望我的所有实体都从同一个

我有一个这样的模型:

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,这样我就不能把它去掉,用和整数替换它


关于最佳实践有什么想法吗?

您当然可以在所有实体中实现相同的EntityInterface,但在每个Id字段中仍然有不同的类型

输入泛型

像这样定义您的接口

public interface IEntity<T>
{
    T Id { get; set; }
}
公共接口的可扩展性
{
T Id{get;set;}
}
在实体中实现接口

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


public class UserSession : IEntity<Guid>
{
    public Guid Id { get; set; }
}
公共类用户:IEntity
{
公共int Id{get;set;}
}
公共类UserSession:用户性
{
公共Guid Id{get;set;}
}
试试这个

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; }
    }
}
公共接口的可扩展性
{
T Id{get;set;}
}
公共抽象类BaseEntity
{
U_id;
公共身份证
{
获取{return\u id;}
设置{u 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; }
    }
} 
公共类人员:BaseEntity
{
字符串_firstName;
字符串_lastName;
公共字符串名
{
获取{return\u firstName;}
设置{u firstName=value;}
}
公共字符串姓氏
{
获取{return\u lastName;}
设置{u lastName=value;}
}
} 

公共类城市:基本实体
{
字符串\u名称;
公共字符串名
{
获取{return\u name;}
设置{u name=value;}
}
}       

始终使用Guid标识实体


guid与int相比有着显著的优势,因为它们可以在客户端生成,这使您可以自由地执行批处理命令,在AJAX中显示插入结果,而无需查询ID等等。

我如何在存储库基界面上实现这一点?它是:公共界面i假设tenty:ientityy你必须建立tenty和TEntityKey的通用存储库,这不是一个很好的设计选择。为什么在IEntity中需要Id字段?
public class City: BaseEntity<City,Guid>
{
    string _name;

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

}