【发布时间】:2012-10-29 17:04:27
【问题描述】:
我目前有一个 Repository/UnitOfWork 模式。但是,有一个我无法弄清楚如何摆脱的硬耦合。
这是我的模式的概述:
业务逻辑层
- I 存储库
- 用作类型约束
- IRepository
- 实现 IRepository
- 一般 CRUD 方法
- IEmployeeRepository
- 实现 IRepository
- 一些员工特定的方法
- IUnitOfWork
- 存储库的获取器
- 保存方法
- IEntityWithId
- 强制(和公开)DTO 和 EF POCO 具有称为 ID 的 Int32 字段的接口
- 用作类型约束
- EmployeeDTO(在实现的 EmployeeRepository 中使用 AutoMapper 映射)
- 在核心项目和(即将到来的)测试项目中使用的 DTO 实体
数据层(用 Ninject 注入)
- 工作单元
- 基于Entity Framework的IUnitOfWork实现
- 员工存储库
- IEmployeeRepository 的实现
- IEmployeeRepository 的实现
- 员工
- 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 要求。但是,这意味着重构会变得很烦人,因为它会用魔术字符串填充代码。
【问题讨论】:
标签: c# design-patterns repository-pattern dto unit-of-work