ASP MVC 将 ApplicationUser 添加到通用存储库



几天前,我决定在我的项目中使用工作单元和通用存储库。经过一番搜索,我找到了这个解决方案来做到这一点。

在此模式中,我们有 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派生的,因此它不能满足约束。

您可以通过两种方式解决此问题:

  1. 为您的用户创建一个类,该类是一个真实实体,因此派生自BaseEntityEntity<T>。这样,就不会违反禁忌。该类可以命名为ApplicationUserEntity或类似的东西。如果需要存储应用程序用户,则需要将ApplicationUser的属性映射到ApplicationUserEntity。您可能还考虑是否真的需要从IdentityUser派生ApplicationUser类并从BaseEntity派生它,而不是创建新类。
  2. 或者,您可以创建每个实体都需要实现的接口。如果示例确实显示了完整的BaseEntity类,则它没有任何成员。因此,您可以轻松地用接口替换BaseEntity,例如IEntity.您可以在当前使用BaseEntity的任何位置使用此接口,尤其是在约束中。由于一个类只能从一个基类派生,但可以实现多个接口,因此可以在ApplicationUser中实现IEntity,以便可以将其用作IEntityService<T>的类型参数。

我倾向于第一种方法,因为它避免将身份验证环境与持久性混合在一起。

但是,如果要实现第二种方法,请先将BaseEntity重命名为IEntity,例如通过访问上下文菜单。这可确保在以前使用过BaseEntity的任何位置使用新名称。然后更改

public abstract class IEntity { }

public interface IEntity { }

您问题的解决方案不是尝试将方形钉子推入圆孔中。自己回答这个问题:当应用于项目的标识部分时,通用存储库会给您带来什么好处?

我怀疑会有很多痛苦和咒骂以及大量的自定义代码ApplicationUserManager因为它们可能无法与您的解决方案一起使用,您必须编写自定义存储或至少部分实现一些逻辑。

仅仅因为有一个模式,并不意味着你必须在任何地方应用它。尤其是图案不适合的地方。

相关内容

  • 没有找到相关文章

最新更新