2011-05-19 59 views
0

问题是关于方便的代码组织。实体框架:POCO和IQueryable代码的封装

我已将POCO类移至持久性独立项目。我是否应该将IQueryable代码(围绕这些POCO的“业务规则”的一部分,例如用于生成派生的非持久性业务对象)一起移动或更好地将Object中的所有IQueryable代码留在库中?

+3

这完全取决于你。 – 2011-05-19 21:49:31

+0

这意味着持久性独立库可以包含IQueryable表达式,它是“不可执行/可测试”的,没有持久层...这种猜测以某种方式将我的神经串起来。 – 2011-05-19 23:23:46

+1

http://stackoverflow.com/questions/6051145/using-the-repository-pattern-to-support-multiple-providers/6051328#6051328暴露'IQueryable'不会破坏测试你的代码的能力,但你将不得不使用集成测试而不是单元测试。检查该答案中的链接。我写了一些关于这个的想法,也许你会在那里找到一些有用的信息。 – 2011-05-20 13:35:35

回答

2

在你的评论中,你说,“这意味着持久性独立库可以包含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."); 

这是一个制造的例子,但希望这个观点很明确:你如何设计这个结构真的取决于你,就像@拉迪斯拉夫所说的那样。

+0

是的,你是对的:可以在“ad hoc”列表上执行IQueryable表达式。 要最终确定:可以将SomeFoos和Foo类的声明放在一起(在一个项目中),不存在矛盾。 – 2011-05-21 12:02:09

+0

您需要将'input.AsQueryable()'传递给LTO示例中的'SomeFoos',是吗? – Slauma 2011-05-22 20:36:19

+0

@Slauma,没错。 – 2011-05-22 21:36:43