9

我在 C# 3.0 中创建了一个简单的桌面应用程序来学习一些 C#、wpf 和 .Net 3.5。我的应用程序本质上是从 csv 文件中读取数据并将其存储在 SQL Server CE 数据库中。我使用 sqlmetal 为数据库生成 ORM 代码。我对这个应用程序的第一次迭代非常丑陋,我正在重构它。

这让我想到了我的问题。您将如何在 C# 中构建桌面数据库应用程序?最佳实践是什么?

您是否创建了使用 sqlmetal 生成的代码的数据库抽象层 (DAL)?或者生成的代码是否足够抽象?

如果您使用 DAL 模式,您会将其设为单例还是静态成员?您是否将 View-Model-ModelView 模式与 DAL 模式一起使用?

如果这似乎是一个长期开放的问题,我深表歉意,但我最近一直在考虑这个问题。我看到很多关于如何在 C# 中构建企业 n 层应用程序的示例,但在构建独立桌面应用程序方面却没有那么多。

4

5 回答 5

4

我将从 Microsoft 的 P&P 团队的WPF 复合应用程序指南咳嗽PRISM咳嗽)开始。下载附带了一个很好的参考应用程序,它是我今天大部分 WPF 开发的起点。

DotNetRocks工作人员刚刚就此采访了Glenn BlockBrian Noyes,如果您有兴趣了解他们的更多信息。

更好的是,如果您对 WinForms 时代的 CAB 完全熟悉的话,Prism 并不像 CAB 那样重。

于 2008-09-05T12:59:13.703 回答
2

答案是一如既往的“视情况而定”。

需要考虑的几件事:您可能希望在某个时候将这个胖客户端应用程序变成一个网络应用程序(例如)。如果是这样,您应该确保在业务层(及以下)和表示层之间保持分离。最简单的方法是确保对业务逻辑的所有调用都通过某种接口。更复杂的方法是实现完整的 MVC 设置。

您可能会考虑的另一件事是使数据访问层独立于业务逻辑和用户界面。我的意思是,从业务逻辑到 DAL 的所有调用都应该是通用的“获取我的数据”而不是“从 SQL 获取我的数据”或更糟的是“运行这个 SQL 语句”。通过这种方式,您可以将您的 DAL 替换为访问不同数据库、XML 文件或什至像平面文件之类的东西的 DAL。

简而言之,关注点分离。这使您可以通过添加不同的 UI、将所有三个区域划分为各自的层或更改相关技术来实现未来的发展。

于 2008-09-05T13:07:38.193 回答
1

在构建任何东西之前,您应该定义应用程序的要求。
这是初学者开发人员的常见错误 - 在考虑代码如何执行之前开始编写代码。我的建议是尝试描述您的应用程序的某些功能。它将帮助您感受它应该如何实施。

至于有用的学习资源,我强烈建议您看一下CompositeWPF,它是一个专为教授开发人员桌面应用程序开发最佳实践而设计的项目。

于 2008-09-05T12:55:05.243 回答
1

我将从 Jeremy Miller 的Build Your Own Cab系列开始。

我是早期的 CAB 采用者。通过深入研究该技术并阅读所有有关应用程序架构的 .NET 博客,我学到了很多东西。

但最近我有机会开始一个新项目,我没有使用 CAB,而是使用了 StructureMap 和 NHibernate,并借用了 Jeremy 使用的一些模式(特别是他处理事件聚合的方式)。结果是一个非常简化的手工工具框架,它可以满足我的一切需求,我喜欢使用它。

至于您的问题的具体细节:我使用存储库进行数据访问。我最初编写了一些 ADO.NET 代码并使用了数据阅读器并映射了我的对象。但这很快就过时了,所以我抓住了 NHibernate 并且非常高兴。存储库使用 NHibernate 进行数据访问,我的数据访问需求在这个特定的应用程序中非常简单。

我有一个利用存储库的服务层(通过 WCF、双工通道公开)。我的应用程序基本上是具有实时更新的客户端-服务器(我知道您的问题只是关于客户端,但我会使用相同的技术和模式)。○

在客户端,我将 MVP 与 StructureMap 用于 IoC 和一些非常简单的事件聚合策略用于跨类通信。我为几乎所有东西编写接口。我唯一做的另一件事是从 CAB 借用灵活的“工作区”来动态显示视图的想法。不过,我编写了自己的 Workspace 界面,并实现了自己的 DeckWorkspace 和 TableWorkspace 以在我的应用程序中使用(这些东西写起来真的很简单)。

我在这个最近的应用程序中的许多决定都是我使用其他框架和工具的经验和痛苦的结果。这次我做了不同的决定。也许真正理解如何构建应用程序的唯一方法是事先感受做错的痛苦。

于 2009-02-04T17:39:21.173 回答
0

我会说是的,它可以很容易地构建成更小的应用程序。入门有一个学习曲线,但老实说,它帮助我更好地理解 WPF,而不是尝试从头开始。在使用 CompositeWPF 开始一个项目,然后在没有它的情况下开始另一个项目后,我发现自己试图自己复制 CompositeWPF 的功能,因为我错过了这些功能!:)

于 2008-09-05T14:28:41.477 回答