我有EntityBase抽象类,通常我所有的实体都继承自它。它采用指定 Id 属性类型的泛型类型(例如 int 或 Guid(。实体库还包含一些用于确定实体之间相等的逻辑。
public abstract class EntityBase<T>
{
public T Id { get; private set; }
...
}
在我的 .Net Core 2.2 Web 应用程序中,我使用的是 Asp.Net Identity,并且我有一个名为 ApplicationUser 的实体,该实体必须继承自 Microsoft.AspNetCore.Identity.IdentityUser。因为不可能从多个基类继承,所以我不能从 EntityBase 继承。
因此,我创建了一个名为IEntity的接口,EntityBase和ApplicationUser都实现了该接口。
public interface IEntity<T>
{
T Id { get; }
}
我有一个 IRepository 接口,该接口具有必须是实体的泛型类型。我不在乎该实体上的 Id 类型是什么。我只是想说,TEntity只需要是一些IEntity,我不在乎它是IEntity还是IEntity。像下面这样。这可能吗?
public interface IRepository<TEntity> where TEntity : IEntity
{
}
约束IEntity<T>
的唯一方法是说:
public interface IRepository<TEntity, TId> where TEntity : IEntity<TId>
{
}
您需要指定类型参数。如果您考虑一下,忽略IEntity<T>
中T
的约束将毫无用处:您将无法使用Id
属性,因为您不知道其类型,这是IEntity<T>
唯一签约的东西。
如果你说你不在乎Id
的类型,那么,你为什么要在乎那个东西是IEntity<T>
呢?
您可以创建一个没有所有实体派生自的参数的接口
public interface IEntity
{
}
public interface IEntity<out T> : IEntity
{
T Id { get; }
}
public abstract class EntityBase<T> : IEntity<T>
{
public T Id { get; private set; }
}
public interface IRepository<TEntity> where TEntity: IEntity
{
}