带有WPF的MVVM在DAL中使用LINQtoSQL以及BLL

时间:2010-02-09 15:09:39

标签: wpf linq-to-sql mvvm

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

1)LINQtoSQL:我在线阅读了很多内容,说LINQ取代了你的DAL,看到很多文章说这个坏主意。我认为这是一个坏主意,但是,我在这里放什么?我将返回BLL的数据类型是什么? IQueryable的?的ObservableCollection?我不知道。

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

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

我已经在线完成了大量的研究,并且已经有了很多东西,但是我没有看到有人谈论在使用SQLMetal和运行的BLL的DAL中使用MVQ和LINQ的WPF应用程序一台服务器。谁能指出我正确的方向?或者可能是一本书?

4 个答案:

答案 0 :(得分:2)

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

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

  2. BLL即服务是一种自然的选择。提供表示层的向上接口(此处WCF服务是一个不错的选择)。

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

答案 1 :(得分:2)

麦克,

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

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

  2. 我的直觉告诉我,你将需要WCF - 在这种情况下,你应该能够将整个业务逻辑整合(是的,那是真的)一个很好的契约,并按照你的意愿实现。 / p>

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

  4. 合同/接口:

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

    你所谈论的'所有层'缩小为单个LINQ2SQL查询执行。如果您需要更多逻辑 - 将其放在此层中。

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

    请询问您是否还有其他问题!

答案 2 :(得分:0)

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

  1. LINQ2SQL非常酷,但VS08设计人员可能会觉得麻烦。看看http://plinqo.com/与CodeSmith一起使用来生成DAL,我认为它甚至可以用BLL签订合同。另一个生成选项是Oleg Sych T4 templates我们遇到LINQ2SQL的一个问题是奇异的datacontext。如果您不需要模块化,这不是问题。

  2. 我同意其他人对数据合同的看法,看看Plinqo可以产生什么。它可以节省你很多时间。

  3. 数据通常可以在对象中运行。像其他人说的那样确保你在所有层之间保持似乎所以你没有依赖关系。

  4. 当你进入MVVM部分时,你将打开一整套新蠕虫。我不认为MVVM上有很多或者任何书籍。这仍然是一种新的时尚。

答案 3 :(得分:0)

很好的问题,我在WCF / WPF学习曲线的幼儿园斜坡上,所以我和你的位置相似。我的2美分:

  1. 没有进入Linq to SQL,我已经老了,习惯于编写存储过程和视图。我目前正在使用它们来填充DTO类 - 即没有方法的类,只是表示数据的属性。我知道我可能在这方面落后于曲线。

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

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

  4. 我正在使用O'Reilly书籍编程WCF服务,学习WCF服务和编程WPF,我发现它非常好。我不知道有关MVVM的任何书籍,但网上有很多东西。