解决方案的结构

时间:2013-10-19 22:49:22

标签: c# asp.net-mvc winforms wcf inversion-of-control

我正处于WinForms产品重写的早期阶段,我正在努力确定"最好的"实施新解决方案结构的战略。当前的解决方案包含50多个项目,并且(大多数情况下)它包含运行应用程序所需的所有逻辑。其中一些项目确实依赖于存在于单独的框架中的项目。解决方案,但也正在被替换/修改。

正如我所说,当前的解决方案产生了WinForms产品;此外,所有东西都紧密地连接在一起,从前到后。此外,除了我们的WinForms产品之外,我们还希望开始提供Web / Mobile解决方案。由于期望的变化,我正在考虑将其分解为几个单独的解决方案。详情如下。

  • Product.Framework Solution成为Product.Core - 包含常用接口,枚举,结构,"助手"等的一组共享程序集。
  • Product.Windows - MVC模式。包含运行WinForms产品所需的所有视图和业务逻辑。
  • Product.Web - MVC模式。包含运行Web产品所需的所有视图和业务逻辑。
  • Product.Services - 托管WCF服务。包含Web / Win / Mobile使用基础DAL调用的公共服务层。

这是我正在寻找一个健全性检查的地方:我计划在WinForms和Web项目中实现DI / IoC(我并不担心注入WCF服务);在我看来,在Product.Core解决方案中拥有所有具体实体(数据库表的表示)和服务的接口是有意义的。我可能需要在Web和Winforms解决方案中使用Product.Services的唯一参考是使用容器注册具体类型。

这有意义吗?我忽略了一些明显的东西吗?感谢您提供任何反馈!

2 个答案:

答案 0 :(得分:2)

我对解决方案的看法是“运行我的程序所需的所有东西”。在您的情况下,您的WinForms应用程序是最后一步。目标是能够从该项目运行输出可执行文件。然后,解决方案应该包含从头开始构建可执行文件所需的每个项目。你想要的最后一件事是让一个新的开发人员必须从版本控制中检查你的源代码,然后必须使用部落知识来确定哪些解决方案需要按顺序构建,然后如何将它们组合在一起。

现在您提到您可能正在添加更多最终步骤应用程序,例如Web应用程序。假设您的WinForms应用程序的依赖项与您的Web应用程序类似,我认为您应该将Web应用程序添加到与WinForms应用程序相同的解决方案中。但是,有时为每个解决方案提供不同的解决方案,然后让每个解决方案引用一组类似的项目。

要记住的一个关键事项是,当引入项目依赖项时,您需要更新解决方案的 所有 以获得新的依赖项。这是我倾向于为大多数事情提供单一解决方案的主要原因。

不要忘记,在Visual Studio中,您可以使用解决方案文件夹来帮助您直观地管理整个解决方案。此外,您可以利用构建配置和依赖关系树,这样当您只需要构建一个最终项目时,构建不需要编译所有内容。最后,您可以使用“设置启动项目”选项在要使用的最终输出之间切换。

请记住,任何给定的项目都可以很容易地成为多个解决方案的一部分。如果您拥有一组用于不同产品的核心框架,则可以在每个“产品”解决方案中包含框架项目。如果框架主要不是由使用它的同一团队处理,您可能需要考虑将框架拆分为单独的存储库,并仅分发输出程序集(将提交到其他存储库并在其他解决方案中引用)。 / p>

一般来说,我的意见是为所有内容提供单一解决方案并利用Visual Studio的各种功能,因此管理如此庞大而复杂的解决方案并不是很痛苦。我建议反对的一件事是,一个解决方案的构建取决于另一个解决方案的构建输出。如果您这样做,这两个项目应该驻留在单独的存储库中,并且应该根据需要复制和提交构建输出(基本上将输出视为第三方库)。

答案 1 :(得分:0)

这里没有“最好的”答案。以下是您的问题的观察结果: 为什么需要所有具体实体的接口? 看起来这些只是数据模型类。除非您正在寻找模拟这些类或编写可以对类的类进行操作的泛型方法(或类),例如实现IEntity接口的所有数据模型类,以便您可以通过数据约束泛型方法/类型号。 示例:

public void MyGenericMethod<T>(T t) : where T:IEntity{ // do something}

听起来,您正在进行的重构/重组将对您所从事的业务产生重大影响,现在所做的设计/架构决策将随着业务的发展而持续发展。我强烈建议在这个过程中让一位建筑师参与进来,了解业务的需求和性质,并据此制定一个游戏计划。