【问题标题】:ASP MVC Add ApplicationUser to Generic RepositoryASP MVC 将 ApplicationUser 添加到通用存储库
【发布时间】:2017-03-15 19:44:02
【问题描述】:

几天前,我决定在我的项目中使用工作单元和通用存储库。在搜索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 继承的。

提示:ApplicationUser 继承自 IdentityUser

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

【问题讨论】:

  • 请显示错误本身。目前尚不清楚它来自哪里。
  • 请再看一遍。

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


【解决方案1】:

IEntityService&lt;T&gt; 接口有一个约束,因此作为T 提供的每种类型都需要从BaseEntity 派生。由于您的 ApplicationUser 类是从 IdentityUser 派生的,因此它无法满足约束。

你可以通过两种方式解决这个问题:

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

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

但是,如果你想实现第二种方法,首先将BaseEntity重命名为IEntity,例如通过访问上下文菜单。这样可以确保在之前使用 BaseEntity 的任何地方都使用新名称。然后改变

public abstract class IEntity { }

public interface IEntity { }

【讨论】:

  • 我更喜欢第二种方式。你能用代码解释一下吗?
  • @user3748973 我已经用示例扩展了答案。希望对您有所帮助。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-01-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-17
    • 2014-01-01
    • 2013-03-09
    相关资源
    最近更新 更多