2010-02-09 122 views
7

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

1)LINQtoSQL:我读过很多网上说,LINQ替换你的DAL,并看到很多文章说这是一个坏主意。我认为这是一个坏主意,但是,我在这里放什么?什么是我回到BLL的数据类型? IQueryable的?的ObservableCollection?我没有任何线索。

2)BLL:我想让这个服务在服务器上运行,这样当我需要进行更改时,我不需要重新部署整个应用程序,我只需要重新启动服务。但是,我不确定从哪里开始。 3)使用BLL,我想我很困惑数据是如何通过从DAL到接口的所有层。我已经做了大量的研究,但是我还没有看到任何人谈论WPF应用程序在使用SQLMetal和BLL运行DAL中使用MVVM与LINQ在服务器上。任何人都可以将我指向正确的方向吗?或者一本书可以得到?

+0

“不幸的是,我们学校没有教授任何专有技术”lol – Will 2010-02-09 15:14:11

回答

2

麦克,

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

  1. 跳过DAL和carefuly观察你的项目 - 如果你有一个感觉,它缺乏这层 - 添加它(它将包含LINQ2SQL查询)。第二部分 - 您可以返回任何您想要的内容,但使用IEnumerable <>或IQueryable <>对您的模型进行参数化将会非常方便。

  2. 我的直觉告诉我,你将需要WCF--在这种情况下,你应该能够将整个业务逻辑包装在一个不错的契约中,然后实现你的愿望。

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

合同/接口:

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

这“所有图层”你在谈论缩减到一个单一的LINQ2SQL查询执行。如果你需要更多的逻辑 - 把它放在这一层。

我想用MVVM,现在怎么样?答案比您想象的要简单 - 只需准备好您的观点并查看模型,并简单地使用您的BLL合同/接口实施。

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

+0

模型 - 视图 - 视图模型中的“模型”本质上就是我将在WCF中包裹的BLL? – Mike 2010-02-12 04:06:21

+0

不完全。请想像一个模型,就像一个单独的图层,它只是为了映射(或者字面上“模型化”)持久数据。简而言之:模型是一组专为建模数据库而设计的类。由于LINQ 2 SQL为你建模(这简直太棒了),请不要担心这个问题 - 你提供了所有的建模类:)如果你还有其他问题 - 请不要犹豫,问问他们。 – 2010-02-12 09:08:05

+0

嗯...我想我在设想图层时遇到了麻烦。让我们看看我是否有这个权利。在顶部,我们已经看到有一个关联的.cs文件,理想情况下没有代码在那里。该视图绑定到ViewModel,它本质上是View的一个适配器。 (现在这是我开始迷失的地方),因为模型由LINQtoSQL处理,我是否在每个ViewModel中引用/连接到WCF BLL?最后,让BLL参考DAL?而dataContext进入DAL? – Mike 2010-02-14 04:28:00

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对象使用不同的类。不要在表示层和数据层之间创建依赖关系。

0

伟大的问题。我不认为有任何一个地方都有答案。当我们开始一个新项目时,我有非常类似的问题。 MVVM实际上只是一种表现模式,并不关心你列出的所有细节。 Laurent Bugnion有一个很好的框架,可以将所有东西粘合在一起。

  1. LINQ2SQL很酷,但VS08的设计人员可能会很麻烦。看看http://plinqo.com/与CodeSmith一起使用来生成DAL,我认为它甚至可以执行带有合同的BLL。另一个生成选项是Oleg Sych T4 templates我们在LINQ2SQL中遇到的一个问题是单数据环境。如果你不需要模块化,这不是问题。

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

  3. 这些数据通常会在对象中运行。像其他人说的一样,确保你在所有图层之间保持一致,这样你就没有依赖关系。

当你到达MVVM部分时,你会打开一个全新的蠕虫罐。我不认为MVVM上有很多或任何书籍。这仍然是一个新的时尚。

0

好问题,我在WCF/WPF学习曲线的苗圃斜坡上,所以我处于与你类似的位置。我的2美分:

  1. 还没有进入Linq to SQL,我是旧学校,习惯编写存储过程和视图。我目前使用这些来填充DTO类 - 也就是说,没有方法的类,只是表示数据的属性。我知道我可能在这个曲线背后。

  2. 使您的BLL成为WCF服务 - 将服务契约和数据契约置于其自己的程序集中,然后将其包含在您的客户端,它们成为您的模型或其中的一部分。

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

我使用O'Reilly出版的编程WCF服务,学习WCF服务,并且我发现相当不错的编程WPF。我不知道任何关于MVVM的书,但网络上有很多东西。

+0

为什么要引用BLL程序集而不是WCF Web服务?为什么WCF需要呢? – 2010-02-10 09:11:47