几天前,我决定在我的项目中使用工作单元和通用存储库。经过一番搜索,我找到了这个解决方案来做到这一点。
在此模式中,我们有 4 层:
1. UI
2. Model
3. Repository
4. Service
关键是所有域模型都继承自模型层中的Entity
类。例如:
public class Project : Entity<int> {
...
}
这是我Entity
课:
public abstract class BaseEntity { }
public abstract class Entity<T> : BaseEntity, IEntity<T>
{
public virtual T Id { get; set; }
}
现在,当我想将类添加到 UoF 模式ApplicationUser
时,我在这个概念上出现错误,即ApplicationUser
不是从BaseEntity
继承的。
提示:
ApplicationUser
是从类继承IdentityUser
向设计模式添加ApplicationUser
的最佳做法是什么?
更新
我在界面中收到错误消息IApplicationUserService
public interface IApplicationUserService : IEntityService<ApplicationUser>
{
Task<Part> GetById(int? id);
}
服务热线:
public interface IEntityService<T> : IService
where T : BaseEntity
{
void Create(T entity);
void Delete(T entity);
Task<List<T>> GetAllAsync();
IEnumerable<T> GetAll();
Task Update(T entity);
}
IEntityService<T>
接口有一个约束,因此作为T
提供的每个类型都需要从BaseEntity
派生。由于您的ApplicationUser
类是从IdentityUser
派生的,因此它不能满足约束。
您可以通过两种方式解决此问题:
- 为您的用户创建一个类,该类是一个真实实体,因此派生自
BaseEntity
或Entity<T>
。这样,就不会违反禁忌。该类可以命名为ApplicationUserEntity
或类似的东西。如果需要存储应用程序用户,则需要将ApplicationUser
的属性映射到ApplicationUserEntity
。您可能还考虑是否真的需要从IdentityUser
派生ApplicationUser
类并从BaseEntity
派生它,而不是创建新类。 - 或者,您可以创建每个实体都需要实现的接口。如果示例确实显示了完整的
BaseEntity
类,则它没有任何成员。因此,您可以轻松地用接口替换BaseEntity
,例如IEntity
.您可以在当前使用BaseEntity
的任何位置使用此接口,尤其是在约束中。由于一个类只能从一个基类派生,但可以实现多个接口,因此可以在ApplicationUser
中实现IEntity
,以便可以将其用作IEntityService<T>
的类型参数。
我倾向于第一种方法,因为它避免将身份验证环境与持久性混合在一起。
但是,如果要实现第二种方法,请先将BaseEntity
重命名为IEntity
,例如通过访问上下文菜单。这可确保在以前使用过BaseEntity
的任何位置使用新名称。然后更改
public abstract class IEntity { }
自
public interface IEntity { }
您问题的解决方案不是尝试将方形钉子推入圆孔中。自己回答这个问题:当应用于项目的标识部分时,通用存储库会给您带来什么好处?
我怀疑会有很多痛苦和咒骂以及大量的自定义代码ApplicationUserManager
因为它们可能无法与您的解决方案一起使用,您必须编写自定义存储或至少部分实现一些逻辑。
仅仅因为有一个模式,并不意味着你必须在任何地方应用它。尤其是图案不适合的地方。