【问题标题】:Tips on designing a .Net framework application设计 .Net 框架应用程序的技巧
【发布时间】:2010-12-02 14:46:43
【问题描述】:

您能否在架构、设计和实施 .net 框架应用程序时向我提供一些提示/指南,要求如下:

  1. 它将是一个分析工具,可以从文件、sql 数据库中检索数据,并且可能是多维数据集。所以数据层应该能够处理这个问题。中间件应该完全独立于其他层,因此可能需要一个 IoC 容器(您会推荐哪个)
  2. 会部署在本地内网
  3. 未来的前端层可能是 WPF 应用程序或 Silverlight(目前,我专注于 Silverlight,但重点是它会改变)
  4. 将来应该很容易自定义和改进它,而无需更改大部分代码,因为该框架将为许多客户部署
  5. 我需要一种方法来存储配置信息,应用程序会在应用程序加载事件中获取这些信息以设置其感觉和外观。

我有两个月的时间来实施它,并尽可能多地寻找技巧。

【问题讨论】:

    标签: c# wpf silverlight


    【解决方案1】:

    SoC 开始

    将您的应用程序分解为几个使用 IoC(接口 + 实现)的程序集:

    • 应用程序模型程序集 - 所有其他程序集都将引用这个,因为这些类将用于相互通信 - 它们大多只是 POCOs
    • 演示程序集 - 参考应用程序模型和业务服务 - 这个是 WPF 或 Silverlight,无论如何使用 MVVM 让您的测试生活更轻松
    • 业务服务程序集 - 引用应用程序模型和数据存储库程序集
    • 数据存储库 - 这些定义了实际从商店获取数据的存储库

    然后我会创建另外三个:

    • 文件数据提供者
    • 数据库提供者
    • 多维数据集提供者

    数据存储库将引用所有这三个并使用它们来提供必要的数据。

    如果配置变得非常复杂,功能很多,那么您也应该将其放在单独的程序集中,并由业务服务程序集引用。

    使用哪个 MVVM 库

    既然你提到了时间,我想你很难赶上你的最后期限。在使用 MVVM(我建议使用)时,我还建议您不要使用完整的 PRISM(又名 P&P 的 Composite Application Guidance),而是使用MVVM Light Toolkit。你会花更少的时间赶上潮流。

    代码生成

    在适当的地方,我建议您充分发挥 T4 的潜力。我用它来import 存储过程调用,以避免在调用存储过程(并使用它们的参数)时使用魔术字符串。也请检查my blog post

    DAL 技术/库

    不要使用诸如SqlConnection/SqlConnection 功能之类的东西编写您自己的数据访问代码。今天有许多数据访问层库/技术可供您使用,而无需重新发明轮子。如果您知道 nHibernate,请使用它。如果您知道 EF,请使用它。如果您知道其他任何内容,请使用它。任何可以为您提供/生成尽可能多的代码并且已经过测试和调试的东西。

    所以这一切归结为:

    干 + YAGNI

    又名。 不要重复自己并且你不会需要它 = 不要过度设计你的代码。

    敏捷开发者应该是懒惰的

    他们应该尽可能地发展,而不是更多! TDD 通过红色 => 绿色 => 重构步骤隐式提供了这个过程。

    【讨论】:

    • 这是个好建议,除了关于单独组件的部分!无论如何,将您的代码划分为表达适当分离关注点的模块,但命名空间是一个非常好的机制。程序集是多余的并且有许多缺点(有关更多详细信息,请参阅 Patrick Smacchia 的精彩文章 herehere。)
    • 我同意减少程序集的数量(良好的链接 Jeff),但我仍然认为将它们全部放在一个中是不明智的。尤其是因为他说他将从 WPF 迁移到 Silverlight...四个程序集是相当标准的(UI、POCO、BL 和 DAL),这使得扩展、维护和插入变得容易(呃)。
    • 谢谢,业务服务组件可以成为 WCF Web 服务吗?你会推荐它,因为它可以在 web 或 windows 上公开。另外,什么是 POCOS?最后,测试呢?我应该为所有程序集创建一个测试项目还是只为所有程序集创建一个测试项目?
    • @fm55:我知道你在做什么。因为银光。对?是的。业务服务也可以是 WCF 服务,既可以通过 HTTP/Sockets/其他方式调用,也可以在 WCF 表示层的情况下直接用作库。所以 WCF 是的。有可能。 POCO = 普通旧 CLR 对象或更好的 普通旧类对象(使其跨语言/技术通用)。 POCO 通常是只有属性的类型。想想只有属性的Person POCO。对人的所有操作都在业务层服务PersonService + DAL PersonRepository 内完成
    【解决方案2】:

    我建议使用 MVVM 和测试驱动开发。 MVVM 将为您提供前端和中间件之间的良好分离,而 TDD 将有助于控制任何不平凡的应用程序开发所带来的混乱。

    【讨论】:

      【解决方案3】:

      查看来自 Microsoft 模式和实践组的 Composite Application Guidance,它可能与您正在做的事情不完全相符,但会给您一些好主意。

      【讨论】:

        【解决方案4】:

        从架构的角度来看,我强烈建议您查看 Microsoft Application Architecture Guide。由于您已经在使用 Microsoft 技术堆栈,因此我会考虑将 Microsoft Unity 用于 IoC。您指出您的表示层可能使用 WPF 或 Silverlight,因此请查看使用 Windows Communication Foundation,因为在与数据层通信时,您在 Silverlight 中会受到一些限制。

        【讨论】:

          猜你喜欢
          • 2010-09-08
          • 2011-10-25
          • 1970-01-01
          • 2011-01-29
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-04
          • 1970-01-01
          相关资源
          最近更新 更多