我当前的Repository/UnitOfWork模式已关闭。然而,有一个硬耦合,我无法弄清楚如何摆脱。
这是我的模式概述:
业务逻辑层
数据层(注入Ninject)
果心
这些是我的通用IRepository接口中的问题方法。
TDTO Find(Expression<Func<TModel, bool>> filter);
和
IEnumerable<TDTO> FindAll(Expression<Func<TModel, bool>> filter);
如您所见,这里有一个TModel,它用于构建表达式来过滤结果。我可以在DTO上使用表达式,但这需要映射到DTO的完整员工列表(也就是它不会生成SQL过滤器,但会过滤SELECT*的员工结果列表)。所以这不是一个好的选择。
另一个更可行但不是最优的解决方案是使用动态LINQ。这样,我可以在Find/FindAll方法中传递一个简单的字符串,并消除TModel需求。然而,这意味着重构变得令人讨厌,因为它用魔法字符串填充代码。
另一种方法是使数据层依赖于业务层,并将存储库“项目”实体映射到业务对象(DTO)中。这样,BL位于底部,UI和数据依赖于它,但UI和数据互不依赖。
这是马克·塞曼在他的《依赖注入》一书中支持的方法。
就在我发布这个的时候,我想我找到了我的问题所在。
Find()和FindAll()甚至不应该存在。我应该在IEmployeeRepository中编写更具体的方法,如FindEmployeeByName(字符串名称),然后像这样实现它:
EmployeeDTO FindEmployeeByName(string name)
{
return Mapper.Map<EmployeeDTO>(dbSet.Where(o=>o.name.Contains(name)).FirstOfDefault());
}
有人能证实这是正确的方法吗?或者建议更好的东西?
编辑
还有,如果我想继续找(表情...)和FindAll(表达式...)方法,我可以,但它们只是在数据层,被实现的方法使用,以避免重复代码。但是它们不应该在控制器中使用,因为它们需要底层数据结构的知识,超出了我的业务逻辑。也就是说,它们可以在BaseRepository中实现
不知道我是否正确解释了这一点。如果不清楚,请告诉我,我会尝试编辑它并使其更好。
在Martin Fowler的书中,我读到了和模式。 作者提到,将identityMap放在UnitOfWork内部是一个好主意。但怎么做呢? 据我所知,受会话限制,但作者没有提到 每个unitOfWork实例需要多少个IdentityMap实例? 如果我们有两个并发请求呢?
我一直在尝试新的Log4j2。从有关迁移的文档来看,XML模式/DTD规范似乎已被废除。 这似乎是倒退了一步。当然,应该可以将XML Schema或DTD与我的相关联,以帮助编写它并进行验证。我在留档中找不到任何有用的东西,也没有找到XML Schema或DTD本身。 那么:在Log4j2中,我应该如何将XML模式与Log4j2.XML相关联?
问题内容: 我发现自己在sqlalchemy中重复了很多这样的事情,我想知道处理它的最佳方法是什么? 问题答案: 从我的工作代码(会话注册表包装器的一种方法)来看,这是正确的。 它是这样使用的: 要么: 实现:
问题内容: 嗨,所有正则表达式高手,我都知道您在解决我的问题。呵呵 要么 要么 (dd-MMM-yyyy),其中yyyy不接受数字以外的任何其他字符 问题答案: 假设月份是3个字母的版本:例如1月,2月,3月。 更新了版本以匹配对问题的更改: 如前所述,这实际上不会验证日期,而只是验证字符串是否匹配以下格式: 1或2个数字,破折号,3个字母,破折号,4个数字 。
抱歉,如果这个帖子不好,这是我在这里的第一个问题:)
问题内容: 我的目标是使用的Android 4.0中的REST Web服务。除非我尝试执行某些操作,否则此方法效果很好。这是相关的代码部分: 这将引发以下异常: 通过调试,我意识到通过的输出流是类型的,并且通过挖掘Android源代码,我发现如果需要重试请求(无论出于何种原因),它就会抛出上述异常,因为它指出了这一点。是 不是 用它想在那里。 现在的问题是:如何使HttpsURLConnectio