繁体   English   中英

如何以这种模式将EF POCO与通用IRepository分离?

[英]How can I decouple the EF POCO from the generic IRepository in this pattern?

我目前有一个Repository / UnitOfWork模式。 但是,有一种硬耦合无法解决。


这是我的模式的概述:

业务逻辑层

  • 知识库
    • 用作约束
  • IRepository <TModel,TDTO>
    • 实现IRepository
    • 通用CRUD方法
  • IEmployeeRepository <TModel>
    • 实现IRepository <TModel,EmployeeDTO>
    • 一些员工特定的方法
  • IUnitOfWork
    • 储存器的吸气剂
    • 保存方式
  • IEntityWithId
    • 强制(和公开)DTO和EF POCO具有称为ID的Int32字段的接口
    • 用作类型约束
  • EmployeeDTO(与已实现的EmployeeRepository中的AutoMapper映射)
    • 核心项目和(即将)测试项目中使用的DTO实体

数据层(使用Ninject注入)

  • 工作单位
    • 基于实体框架的IUnitOfWork的实现
  • 员工资料库
    • IEmployeeRepository <TModel>的实现
  • 雇员
    • EF POCO

核心

  • 员工控制器
    • 参数化构造函数EmployeesController(IUnitOfWork unitOfWork)
    • IUnitOfWork与Ninject模块一起作为UnitOfWork注入(来自数据层)

这些是我的通用IRepository接口中的问题方法。

TDTO Find(Expression<Func<TModel, bool>> filter);

IEnumerable<TDTO> FindAll(Expression<Func<TModel, bool>> filter);

如您所见,其中有TModel,用于构建表达式以过滤结果。 我可以做一些类似于在DTO上使用表达式的操作,但是这需要映射到DTO的雇员的完整列表(也就是不会生成SQL过滤器,但是会过滤SELECT * FROM Employee结果列表)。 因此,这不是一个好选择。

另一种更可行但并非最佳的解决方案是使用动态LINQ。 这样,我可以在Find / FindAll方法中传递一个简单的字符串,并摆脱TModel的要求。 但是,这将意味着重构变得很烦人,因为它用魔术字符串填充了代码。

正如我发布此文章一样,我想我已经弄清楚了问题所在。

Find()和FindAll()甚至都不存在。 我应该在IEmployeeRepository中编写更具体的方法,例如FindEmployeeByName(string name),然后像这样实现它:

EmployeeDTO FindEmployeeByName(string name)
{
    return Mapper.Map<EmployeeDTO>(dbSet.Where(o=>o.name.Contains(name)).FirstOfDefault());
}

谁能确认这是正确的方法? 或提出更好的建议?

编辑

另外,如果我想保留Find(Expression ...)和FindAll(Expression ...)方法,可以,但是它们只是在Data层中,已实现的方法使用它们来避免重复代码。 但是,不应将它们用于控制器中,因为它们需要了解除我的业务逻辑之外的底层数据结构。 就是说,可以在BaseRepository <TModel>中实现它们(我已经提过,但没有提到使事情更简单),并使EmployeesRepository扩展了BaseRepository。 这样,每个存储库都已经具有可识别模型的类通用方法。

不知道我是否解释正确。 如果尚不清楚,请告诉我,我将尝试对其进行修改并使其变得更好。

执行此操作的另一种方法是使数据层依赖于业务层,并使存储库“项目”实体进入业务对象(DTO)。 这样,您的BL位于底部,UI和Data相互依赖,但UI和Data不相互依赖。

这是Mark Seemann在其关于“依赖注入”的书中所拥护的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM