问题是关于方便的代码组织。实体框架:POCO和IQueryable代码的封装
我已将POCO类移至持久性独立项目。我是否应该将IQueryable代码(围绕这些POCO的“业务规则”的一部分,例如用于生成派生的非持久性业务对象)一起移动或更好地将Object中的所有IQueryable代码留在库中?
问题是关于方便的代码组织。实体框架:POCO和IQueryable代码的封装
我已将POCO类移至持久性独立项目。我是否应该将IQueryable代码(围绕这些POCO的“业务规则”的一部分,例如用于生成派生的非持久性业务对象)一起移动或更好地将Object中的所有IQueryable代码留在库中?
在你的评论中,你说,“这意味着持久性独立库可以包含IQueryable表达式,它是”不可执行/可测试的“,没有持久层...”。这不是真的。你可以用(主要)不依赖于持久性的方式来测试IQueryable表达式。
如:
public IQueryable<Foo> SomeFoos(IQueryable<Foo> foos, string aValue)
{
return from foo in foos
where foo.Bar = aValue
select foo;
}
您可以L2E使用:
var f = SomeFoos(myContext, "Baz");
你可以用L2O测试:
var expected = new Foo { Bar = "Baz" };
var notExpected = new Foo { Bar = "Oops" };
var input = new [] { expected, notExpected };
var actual = instance.SomeFoos(input.AsQueryable(), "Baz");
Assert.AreEqual(actual.First(), expected, "Should have found expected record.");
Assert.AreNotEqual(actual.Single(), notExpected, "Should not have found unexpected record.");
这是一个制造的例子,但希望这个观点很明确:你如何设计这个结构真的取决于你,就像@拉迪斯拉夫所说的那样。
是的,你是对的:可以在“ad hoc”列表上执行IQueryable表达式。 要最终确定:可以将SomeFoos和Foo类的声明放在一起(在一个项目中),不存在矛盾。 – 2011-05-21 12:02:09
您需要将'input.AsQueryable()'传递给LTO示例中的'SomeFoos',是吗? – Slauma 2011-05-22 20:36:19
@Slauma,没错。 – 2011-05-22 21:36:43
这完全取决于你。 – 2011-05-19 21:49:31
这意味着持久性独立库可以包含IQueryable表达式,它是“不可执行/可测试”的,没有持久层...这种猜测以某种方式将我的神经串起来。 – 2011-05-19 23:23:46
http://stackoverflow.com/questions/6051145/using-the-repository-pattern-to-support-multiple-providers/6051328#6051328暴露'IQueryable'不会破坏测试你的代码的能力,但你将不得不使用集成测试而不是单元测试。检查该答案中的链接。我写了一些关于这个的想法,也许你会在那里找到一些有用的信息。 – 2011-05-20 13:35:35