我有现有的解决方案,它采用代码优先的方法。
它有PersistentEntity
作为所有实体的基类。
public interface IPersistentEntity
{
int Id { get; }
bool IsNew { get; }
}
public abstract class PersistentEntity : IPersistentEntity, IValidatableObject
{
// some code here
}
PersistentEntity
用作验证对象+覆盖Equals()
和GetHashCode()
的默认行为。 Id
属性的类型int
- > IsNew
属性具有简单的实现:
public bool IsNew
{
get
{
return this.Id == 0;
}
}
IsNew
本身由通用存储库Repository
使用。一切正常。
但是现在我们决定使用Guid
作为我们的一个实体的Id,这有点打破了设计。
第一个想法是以通用方式实现PersistentEntity
- &gt; PersistentEntity<T>
,这很好,但在这种情况下,它会破坏通用Repository<T>
:
IEntityRepository<T> Repository<T>() where T : class, IPersistentEntity<??>
解决此问题的最佳方法是什么?
答案 0 :(得分:1)
如果在IsNew
方法中仅使用Repository<T>
,则可以为此分隔界面。像
public interface IPersistentEntity
{
bool IsNew { get; }
}
public interface IPersistentEntity<T> : IPersistentEntity
{
T Id { get; }
}
因此,您可以将方法声明为
IEntityRepository<T> Repository<T>() where T : class, IPersistentEntity
答案 1 :(得分:0)
您可以传递多个Generic值,如下所示:
Repository<T, TIdent>() where T : class, IPersistentEntity<TIdent>
然后你的IPersistentEntity看起来像这样:
public interface IPersistentEntity<out TIdent>
{
TIdent Id { get; }
bool IsNew { get; }
}