前几天我决定使用工作单位&通用存储库在我的项目中。经过一点点搜索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);
}
答案 0 :(得分:2)
T
接口有一个约束,因此每个以BaseEntity
提供的类型都需要从ApplicationUser
派生。由于您的IdentityUser
类派生自BaseEntity
,因此无法满足约束条件。
您可以通过两种方式解决此问题:
Entity<T>
或ApplicationUserEntity
。这样,不会违反约束。该类可以命名为ApplicationUser
或类似的东西。如果您需要存储应用程序用户,则需要将ApplicationUserEntity
的属性映射到ApplicationUser
。您可能还会考虑是否确实需要从IdentityUser
派生BaseEntity
类,并从BaseEntity
派生而不是创建新类。 BaseEntity
类,则它没有任何成员。因此,您可以轻松地通过界面替换IEntity
,例如BaseEntity
。在当前使用IEntity
的地方使用此接口,尤其是在约束中。由于类只能从一个基类派生,但可以实现多个接口,因此可以在ApplicationUser
中实现IEntityService<T>
,以便可以将其用作BaseEntity
的类型参数。 我赞成第一种方法,因为它避免了将身份验证环境与持久性混合。
但是,如果您要实施第二种方法,请先将IEntity
重命名为BaseEntity
,例如通过访问上下文菜单。这可以确保在以前使用public abstract class IEntity { }
的任何地方使用新名称。然后改变
public interface IEntity { }
到
id
答案 1 :(得分:0)
解决问题的方法不是试图将方形钉子推入圆孔。自己回答这个问题:当应用于项目的Identity部分时,通用存储库会给你带来什么好处?
我怀疑会有很多痛苦和咒骂以及大量自定义代码,因为ApplicationUserManager
可能无法使用您的解决方案而且您必须编写自定义存储空间或者至少部分实现一些逻辑。
仅仅因为有一种模式,并不意味着你必须在任何地方应用它。特别是图案不适合的地方。