您将如何在C#3.0中构建桌面应用程序

时间:2008-09-05 12:48:42

标签: c# wpf architecture

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

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

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

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

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

5 个答案:

答案 0 :(得分:4)

我将从微软P& P团队的Composite Application Guidance for WPF咳嗽 PRISM 咳嗽)开始。随着下载提供了一个很好的参考应用程序,这是我今天大多数WPF开发的起点。

DotNetRocks crew刚刚采访了Glenn BlockBrian Noyes,如果您有兴趣听取他们的更多信息。

更好的是,Prism并不像CAB那么重,如果你对WinForms时代的那些熟悉的话。

答案 1 :(得分:2)

答案是“它依赖于”。

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

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

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

我是CAB的早期采用者。我从挖掘技术和阅读有关应用程序架构的所有.NET博客中学到了很多东西。

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

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

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

在客户端我利用结构图的MVP为IoC和一些非常简单的事件聚合策略进行跨类通信。我为几乎所有东西编写接口代码。我做的唯一另一件事就是从CAB借用一个灵活的“工作区”来动态显示视图。我编写了自己的Workspace接口并实现了自己的DeckWorkspace和TableWorkspace以便在我的应用程序中使用(这些都是非常简单的事情)。

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

答案 4 :(得分:0)

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