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

时间:2020-03-05 18:48:11  来源:igfitidea点击:

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

这使我想到了我的问题。我们将如何使用C#设计桌面数据库应用程序?
最佳做法是什么?

我们是否创建使用sqlmetal生成的代码的数据库抽象层(DAL)?还是生成的代码足够抽象?

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

道歉,如果这似乎是一个长期未解决的问题,但是最近我一直在考虑这个问题。
我看到了很多关于如何在C中构建企业级n层应用程序的示例,但是没有多少关于构建独立桌面应用程序的示例。

解决方案

回答

在架构任何东西之前,我们应该定义应用程序的需求。
这是初学者开发人员在思考代码性能之前开始编写代码的常见错误。我的建议是尝试描述应用程序的某些功能。它将感觉应如何实施。

至于有用的学习资源,我强烈建议我们看一下CompositeWPF,它是一个旨在向开发人员讲授桌面应用程序开发最佳实践的项目。

回答

我将从Microsoft P&P团队的WPF(咳嗽PRISM咳嗽)复合应用指南开始。下载提供了一个很棒的参考应用程序,这是我今天大多数WPF开发的起点。

如果我们有兴趣了解更多信息,DotNetRocks团队刚刚就此采访了Glenn Block和Brian Noyes。

甚至更好的是,如果我们完全熟悉WinForms时代的产品,Prism的负担将不如CAB那么重。

回答

答案是"视情况而定"。

需要考虑的几件事:
我们可能需要在某个时候将此胖客户端应用程序设为网络应用程序。如果是这样,则应确保在业务层(及其下)和演示文稿之间保持分隔。最简单的方法是确保对业务逻辑的所有调用都经过某种接口。一种更复杂的方法是实现完整的MVC设置。

我们可能要考虑的另一件事是使数据访问层独立于业务逻辑和用户界面。我的意思是,从业务逻辑到DAL的所有调用都应该是通用的"获取此数据",而不是"从SQL获取此数据",甚至更糟的是"运行此SQL语句"。这样,我们可以将DAL替换为可访问其他数据库,XML文件甚至是诸如平面文件之类的东西的DAL。

简而言之,关注点分离。这样,我们可以通过添加不同的UI,将所有三个区域划分为各自的层或者更改相关技术来在将来发展。

回答

我会说是的,它很容易针对较小的应用程序进行结构化。有一个开始学习的曲线,但说实话,它比起从头开始帮助我更好地了解WPF。用CompositeWPF启动一个项目,然后不使用它启动另一个项目之后,我发现自己试图自己复制CompositeWPF的功能,因为我错过了这些功能! :)

回答

我将从杰里米·米勒(Jeremy Miller)的《打造自己的出租车》系列开始。

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

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

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

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

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

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