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

时间:2017-03-15 19:44:02

标签: c# asp.net-mvc entity-framework asp.net-identity

前几天我决定使用工作单位&通用存储库在我的项目中。经过一点点搜索I found this solution来完成此操作。

在这种模式中,我们有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; }
}

现在,当我想将ApplicationUser类添加到UoF模式时,我发现ApplicationUser不是BaseEntity继承的概念时出错。

  

提示:ApplicationUserIdentityUser

的继承

ApplicationUser添加到我的设计模式的最佳做法是什么?

更新

我在IApplicationUserService界面

中收到错误消息
public interface IApplicationUserService : IEntityService<ApplicationUser>
{
    Task<Part> GetById(int? id);
}

IEntityService

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);
}

2 个答案:

答案 0 :(得分:2)

T接口有一个约束,因此每个以BaseEntity提供的类型都需要从ApplicationUser派生。由于您的IdentityUser类派生自BaseEntity,因此无法满足约束条件。

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

  1. 为您的用户创建一个真实实体的类,因此派生自Entity<T>ApplicationUserEntity。这样,不会违反约束。该类可以命名为ApplicationUser或类似的东西。如果您需要存储应用程序用户,则需要将ApplicationUserEntity的属性映射到ApplicationUser。您可能还会考虑是否确实需要从IdentityUser派生BaseEntity类,并从BaseEntity派生而不是创建新类。
  2. 作为替代方案,您可以创建每个实体都需要实现的接口。如果您的示例确实显示完整的BaseEntity类,则它没有任何成员。因此,您可以轻松地通过界面替换IEntity,例如BaseEntity。在当前使用IEntity的地方使用此接口,尤其是在约束中。由于类只能从一个基类派生,但可以实现多个接口,因此可以在ApplicationUser中实现IEntityService<T>,以便可以将其用作BaseEntity的类型参数。
  3. 我赞成第一种方法,因为它避免了将身份验证环境与持久性混合。

    但是,如果您要实施第二种方法,请先将IEntity重命名为BaseEntity,例如通过访问上下文菜单。这可以确保在以前使用public abstract class IEntity { } 的任何地方使用新名称。然后改变

    public interface IEntity { }
    

    id

答案 1 :(得分:0)

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

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

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