【问题标题】:MVVM with WPF using LINQtoSQL in a DAL along with a BLL带有 WPF 的 MVVM 在 DAL 和 BLL 中使用 LINQtoSQL
【发布时间】:2010-02-09 15:09:39
【问题描述】:

我的目标是拥有一个使用 WPF 并且是 3 层架构的应用程序。 UI、BLL 和 DAL...我想使用 MVVM,但我不确定它如何与 3 层架构一起使用,或者它是否完全不同。考虑到这一点,我有几个问题:

1) LINQtoSQL:我在网上阅读了很多说 LINQ 取代了您的 DAL 的文章,并且看到很多文章说这是一个坏主意。我认为这是一个坏主意,但是,我在这里放什么?我要返回 BLL 的数据类型是什么?可查询?可观察的集合?我不知道。

2) BLL:我想让它成为在服务器上运行的服务,这样当我需要进行更改时,我不需要重新部署整个应用程序,我只需要重新启动服务.但是,我不确定从哪里开始。

3) 对于 BLL,我想我对数据如何通过从 DAL 一直到接口的所有层的方式感到困惑。

我在网上做了很多研究,并且得到了一些零碎的东西,但是我还没有看到任何人谈论一个 WPF 应用程序,它在 DAL 中使用 MVVM 和 LINQ,使用 SQLMetal 和一个在其上运行的 BLL服务器。谁能指出我正确的方向?或者要买一本书?

【问题讨论】:

  • “很遗憾我们学校不教授任何专有技术”哈哈

标签: wpf linq-to-sql mvvm


【解决方案1】:

迈克,

你的问题很酷,我喜欢。首先,随意尝试一下——每个项目都是不同的,因此没有适用于任何地方的单一规则。这就是为什么我建议将 DAL 留给 LINQ 2 SQL。这个伟大的工具会处理它,你不必担心。其次 - 你提到了 3 层架构,但为什么没有模型的地方?由于所有模型都是自动生成的(例如 SQLMetal),因此您也不必担心映射。所以,如果你还不觉得无聊,让我来回答你所有的 3 个问题:

  1. 跳过 DAL 并仔细观察您的项目 - 如果您感觉它缺少这一层 - 添加它(它将包含 LINQ2SQL 查询)。第二部分 - 你可以返回任何你想要的东西,但最方便的是使用 IEnumerable 或 IQueryable 参数化你的模型。

  2. 1234563 /p>
  3. 这是最简单的一个 :) 由于您的 BLL 层实际上是某个合约(接口)的实现,您可以设计该接口来为您提供所需的所有数据。例如:

合约/接口:

IEnumerable<User> GetTallUsersOver40();
IEnumerable<User> GetShortUsersOver60();
...

您所说的“所有层”都缩小为单个 LINQ2SQL 查询执行。如果您需要更多逻辑 - 将其放在这一层中。

我想使用 MVVM,现在怎么办?答案比您想象的要简单 - 只需准备您的视图和视图模型,然后简单地使用您的 BLL 合同/接口实现。

如果您还有其他问题,请询问!

【讨论】:

  • 那么 Model-View-ViewModel 中的“模型”本质上是我将在 WCF 中包装的 BLL 吗?
  • 不完全是。请考虑一个模型,就像一个单独的层,只是为了映射(或字面意思是“模型”)你的持久数据。简而言之:模型是一组用于建模数据库的类。由于 LINQ 2 SQL 为您进行建模(这简直太棒了),所以请不要担心 - 您已经提供了所有建模类 :) 如果您还有其他问题 - 请不要犹豫。
  • 嗯...我想我在构想图层时遇到了麻烦。让我们看看我是否有这个权利。在顶部,我们有一个视图,它有一个关联的 .cs 文件,理想情况下没有代码进入。视图绑定到 ViewModel,它本质上是视图的适配器。 (现在这是我开始迷路的地方),由于模型由 LINQtoSQL 处理,我是否在每个 ViewModel 中放置了对 WCF BLL 的引用/连接?最后,BLL 是否引用了 DAL?并且 dataContext 进入 DAL?
  • 是的,你是 100% 正确的。每个 ViewModel 都可以引用 WCF BLL(您可以为项目中的每个 VM 考虑类似 ViewModel 基类的东西),BLL 引用 DAL(但如果您确实需要一个 - 在其他情况下 - 只需通过直接从 BLL 查询您的持久数据林克)。最后一件事(DataContext) - 如果您正在谈论您的视图 DataContexts,它们应该明确指向您的 ViewModels 的实例。请随时提出更多问题:)
  • 我必须拥有 DAL,因为这不取决于我。所以我的下一个问题是,我们将 .dbml 文件放在 DAL 中;将数据一直返回到视图模型/界面的正确方法是什么?从查询到显示...
【解决方案2】:

我会尝试提供一些见解,虽然我不是专家,但我过去已经解决过这些问题。

  1. LINQ to SQL 实际上非常擅长它应该做的事情 - 即替换您的 DAL。但是不要将 IQueriable 向上返回到您的 BLL,因为这将启用(或至少暗示可能性)BLL 直接查询您的数据库。您应该将数据对象传输到 BLL 并让它构造一个匹配的业务对象。 另请注意: LINQ 本身可用于任何层(实际上是 C# 的最佳特性之一)。 LINQ to SQL 是将 LINQ 语句转换为 SQL 查询的机制。

  2. 作为服务的 BLL 是一种自然选择。提供到表示层的向上接口(WCF 服务在这里是一个不错的选择)。

  3. BLL 根据从 DAL 接收的数据生成业务对象。为了提供良好的层解耦,您应该为 DAL 和 BLL 对象使用不同的类。不要在表示层和数据层之间创建依赖关系。

【讨论】:

    【解决方案3】:

    很好的问题。我认为没有一个地方可以提供所有答案。当我们开始一个新项目时,我有非常相似的问题。 MVVM 实际上只是一种演示模式,并不关心您列出的所有细节。 Laurent Bugnion 有一个很好的框架,可以将所有东西粘合在一起。

    1. LINQ2SQL 很酷,但使用 VS08 设计器可能会变得很麻烦。看看http://plinqo.com/ 与 CodeSmith 一起使用来生成 DAL,我认为它甚至可以使用合约执行 BLL。另一个生成选项是Oleg Sych T4 templates 我们在使用 LINQ2SQL 时遇到的一个问题是单一数据上下文。如果您不需要模块化,这不是问题。

    2. 我同意其他人对数据合同的看法,并看看 Plinqo 可以生成什么。它可能会为您节省大量时间。

    3. 数据通常会在对象中以向上的方式工作。就像其他人说的那样,确保你在所有层之间保持一个外观,这样你就没有依赖关系。

    当您进入 MVVM 部分时,您将打开一个全新的蠕虫罐。我认为目前还没有很多或任何关于 MVVM 的书籍。它仍然是一种新的时尚。

    【讨论】:

      【解决方案4】:

      很好的问题,我正处于 WCF/WPF 学习曲线的初级阶段,所以我的位置与你相似。我的 2 美分:

      1. 还没有接触过 Linq to SQL,我是老派,习惯于编写存储过程和视图。我目前正在使用这些来填充 DTO 类——即没有方法的类,只有表示数据的属性。我知道我可能在这方面落后了。

      2. 使您的 BLL 成为 WCF 服务 - 将服务合同和数据合同放在它们自己的程序集中,然后您可以将其包含在您的客户端中,在那里它们成为您的模型或其中的一部分.

      3. 在您的客户端应用程序中,包括对包含服务合同和数据合同的程序集的引用。然后数据契约成为您的模型,您的 ViewModel 可以包装这些模型并公开它们的属性(实现 INotifyPropertyChanged 以进行数据绑定)。

      我正在使用 O'Reilly 的《Programming WCF Services》、《Learning WCF Services》和《Programming WPF》这几本书,我发现它们非常好。我不知道任何专门关于 MVVM 的书籍,但网络上有很多东西。

      【讨论】:

      • 为什么要引用 BLL 程序集而不是 WCF Web 服务?那么为什么需要 WCF?
      猜你喜欢
      • 2010-10-01
      • 1970-01-01
      • 2011-01-23
      • 2013-02-06
      • 2015-05-13
      • 2013-09-24
      • 2011-04-03
      • 2011-04-26
      • 2017-10-19
      相关资源
      最近更新 更多