在 BLL 或 UI 中使用 Linq-to-SQL 实体?

Posted

技术标签:

【中文标题】在 BLL 或 UI 中使用 Linq-to-SQL 实体?【英文标题】:Using Linq-to-SQL entities in your BLL or UI? 【发布时间】:2010-12-17 17:30:49 【问题描述】:

前几天,我有一个客户寻求构建一个简单的 WPF LOB 应用程序的建议。他们基本上想要一个用于数据库的 CRUD 应用程序,主要目的是作为 WPF 培训项目。

我还向他们展示了 Linq To SQL,他们印象深刻。

然后我解释说,直接从他们的 BLL 或 UI 代码中使用 L2S 实体可能不是一个好主意。他们应该考虑类似 Repository 模式。

此时我已经可以感觉到过度工程的警钟在他们的脑海中响起(在某种程度上也在我的脑海中)。他们真的需要一个简单的 CRUD 应用程序的所有复杂性吗? (好吧,它有效地充当了他们的 WPF 培训项目,但让我们假装它变成了一个“真正的”应用程序)。

您是否认为在整个应用程序中使用 L2S 实体是可以接受的? (根据经验)重构以后使用另一个持久性框架有多困难?

在我看来,如果 UI 层将 L2S 实体用作简单的 POCO(不涉及任何 L2S 特定方法),那么以后如果需要的话应该很容易重构。

他们确实需要一种方法来集中 L2S 查询,因此需要某种方式来管理它,即使他们确实直接使用 L2S 实体。所以在某种程度上我们已经在推动 DAL/DAO/Repository 的某些方面。

我可以看到 Repo 的主要问题是 L2S 实体和某些域模型之间的映射的痛苦。它真的值得吗?您可以在 L2S 实体上“免费”获得很多东西,我认为一旦映射到另一个模型就很难使用。

想法?

【问题讨论】:

【参考方案1】:

基本上,我们为一个项目所做的是,我们有一个业务层,它对 L2S 对象执行所有“LINQing”...本质上通过“管理器对象”将所有查询集中到一个层(我猜这些有点类似于存储库)。

我们没有使用 DTO 映射到 L2S;因为我们不觉得在这个项目中付出努力是值得的。我们的部分逻辑是,随着越来越多的 ORM 支持 Iqueryable 和与 L2S 类似的语法(例如实体框架),那么切换到不同的 ORM 可能不会那么糟糕,所以它不是那么糟糕,IMO .

【讨论】:

【参考方案2】:

存储库没什么大不了的。请参阅此处以很好地处理它们在 ASP.NET MVC 中的使用:

http://nerddinnerbook.s3.amazonaws.com/Part3.htm

【讨论】:

我认为他们在那种情况下不是什么大不了的原因是他们直接使用 L2S 实体作为他们的“域”模型。我怀疑很多人对此不以为然。但它的启动和运行速度肯定很快,并且可能在这个项目上运行良好。 是否合适,取决于项目的大小。在小型项目中(我有一个有 30 个表,而 *** 至少有这么多),L2S 实体可以正常工作。【参考方案3】:

您是否认为在整个应用程序中使用 L2S 实体是可以接受的?

这取决于。如果你做一个短命的产品,如果你使用 L2S,你可以很容易地快速连续地把事情连接起来。但是,如果您做一个可能需要长期维护的长期产品,那么您最好考虑一个适当的持久层。

(根据经验)重构以后使用另一个持久性框架有多困难?

如果您在所有层中都使用 L2S,那么您一定不要考虑重构它们以使用另一个持久性框架。这正是在持久层中使用 NHibernate 或 Entity Framework 等框架的优势,虽然它需要一些额外的前期工作,但从长远来看很容易维护

【讨论】:

【参考方案4】:

一直使用 L2S 实体的唯一主要缺点是您的 UI 需要了解并绑定到具体实体。这意味着您的 UI 知道您的数据层。通常不是一个好主意。你真的想要一个分层的方法来处理任何可能很严重的事情。

也就是说,完全可以在分层架构中使用 LINQ-to-SQL 实体本身,而无需了解数据层:提取实体的接口并绑定到它们。

请记住,所有 L2S 实体都是部分类。创建反映您的实体的接口(@98​​7654321@ 是您的朋友)并创建实现接口的实体的部分类定义。将接口本身(并且只有接口)放在您的 UI 和业务层引用的单独 .DLL 中。让您的业务层和数据层接受和发出这些接口,而不是它们的具体版本。您甚至可以让接口实现INotifyPropertyChanging,因为 L2S 实体本身实现了这些接口。一切都很顺利。

然后,当/如果您需要不同的持久性框架时,您在 BL 或 UI 中完全没有痛苦,只有在数据层——这正是您想要的。

【讨论】:

借助强大的数据绑定功能,使用 WPF,UI 并不真正需要在很大程度上“了解”具体实体 使用接口的好主意,但我想知道围绕 L2S 部分类构建“模型”是否有任何痛点 嗯,我注意到的第一个痛点是你的 using 语句必须在部分类文件的文件的命名空间声明中(如果你的 L2S 文件是 Foo.dbml,通常是 Foo.cs) , 否则设计师断断续续难断。但最大的痛点是联想;您必须构建一些将关联实体转换为其接口的实现,并且创建关联树/层次结构可能很粗糙。通常最好在您的数据层实现关联构建。 此外,您仍然必须引用具体的类,即使使用 WPF 超级棒的数据绑定。【参考方案5】:

听起来您应该考虑 WPF 的 ViewModel 模式

http://msdn.microsoft.com/en-us/magazine/dd419663.aspx

【讨论】:

以上是关于在 BLL 或 UI 中使用 Linq-to-SQL 实体?的主要内容,如果未能解决你的问题,请参考以下文章

不同的 UI 共享相同的 BLL 和 DAL

如何在 UI、BLL、DAL 之间使用 DTO

除了实例化 DAL 的 BLL 之外,还有啥选项允许在 n 层解决方案中进行单元测试,而不会将 DAL 暴露给 UI 或将 BLL 暴露给 DAL?

在业务层 (BLL) 中使用设置文件

如何在 3 层(单层)应用程序中在 BLL 和 UI 之间传递数据?

BILL 错误最佳实践