我的模型看起来像这样:
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所以我不能只是摆脱它并用整数替换它。
关于最佳做法的任何想法?
答案 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等。