应用项目结构问题

时间:2011-08-21 07:11:17

标签: c# delphi architecture

我想问一下您在开发和部署一个通常具有一些标准功能的应用程序方面的经验,但该应用程序也可以具有客户特定功能。
例如:

  1. 客户1具有标准功能,但也需要搜索功能。
  2. 客户2仅具有标准功能。
  3. 客户3具有标准功能,并且还需要员工日历。
  4. 你会如何解决这个问题?

    您是否有一个项目可以从中部署所有应用程序,然后使用某种配置文件来确定特定应用程序中哪些功能可用?

    您是否为每位客户提供了一个项目?这就是我现在正在做的事情,但问题是如果需要在标准功能中修复错误,我必须在每个项目中修复它们。

    非常欢迎任何其他建议。

    该应用程序是用Delphi和C#开发的。

5 个答案:

答案 0 :(得分:5)

我的公司通过为所有客户提供所有功能来解决这个问题。这使开发更简单,使我们可以花更多的时间来改进产品,而不必花时间处理可选功能的复杂性。

我们有时遇到来自客户的温和抵制,这些客户想要功能较少的便宜版本,但这从来就不是销售问题。

另一方面,如果您向客户销售价格较低的功能较少的版本,他们可能会试图摆脱这些更便宜的版本。这可能导致他们不喜欢软件,因为他们买了便宜的残缺版本。我坚信能够为用户提供最好的产品。

此建议可能不适合您的个人情况,但您确实表示欢迎任何意见。

答案 1 :(得分:5)

每个客户一个版本不是个好主意,恕我直言。它将在一天或更晚的时间内停止销售。

最好让所有功能都发布给所有客户,例如,只需维护一个软件,但需要用密码锁定。您可以在软件安装中提供唯一的许可证编号,以识别客户(将其名称放在许可证中),然后根据此许可证编号计算一些密码,根据请求解锁某些功能 - 付款时。这个密码可以通过网站轻松实现自动化,而且成本最低。

或者您也可以让所有功能都可用于测试,但锁定打印或保存 - 只是为了让客户考虑花一些钱来获得这个“很好的附加功能”。

有时,拥有所有功能往往会创建一个“Gasworks”应用程序。您可能需要单独的安装应用程序,以根据客户的需求自定义应用程序。值得考虑这个架构。

即使使用版本控制,多个版本仍然是一个需要维护的噩梦:例如,只需将所有修补程序后端移植到以前的版本就需要花费大量时间。如果您不需要(例如,由于监管目的/认证版本),请不要“分支”您的软件。

答案 2 :(得分:4)

每个客户肯定没有一个项目,每个客户可以有一个解决方案,您可以根据需要设置所有项目。

只是为了给你一个替代插件架构,这是正确的方法,但通常也相当复杂。

选项1。

  1. 在主项目(核心)中放置常用功能

  2. 日历中的其他内容放在单独的DLL项目中(每个功能一个)

  3. 创建VS SOLUTIONS,您可以在其中聚合特定设置+核心的所有项目。因此,customer1将拥有Customer1Silution with Core以及他需要的所有其他项目,customer2将其解决方案与Core及其他内容相结合。

  4. 1选项。

    为每一个设置一个大的设置,并根据其配置/许可启用/禁用用户访问其他功能。

    取决于您的资源,如时间,经验,与您合作的人,客户,您可以选择更适合您的选项。

    基于1个插件:可能是最好的一个,但它很复杂,如果你从未在类似之前做过,那么你需要花一点时间熟悉它。

    选项1简单快捷,但如果客户数量和配置变得迟钝,您将跳入规模问题。

    选项2是这两者之间的平均值,但要注意您的设置维度。

    考虑到您在解决方案中引用项目和替代项,如果您在一个解决方案中解决Core中的问题,它也将影响所有其他解决方案。

答案 3 :(得分:2)

你有几个选择:

  • 将“标准功能”放入可由其他版本使用/链接的单独模块中
  • 使用“插件架构”动态加载可选功能

答案 4 :(得分:1)

除了其他人所说的,还有另一种选择:条件定义。

使用条件编译,您可以使用IFDEFS(IFDEF EmployeeCalendar,IFDEF SearchFunction ...)包装特定于功能的代码。然后,对于每个客户端,只复制项目文件,并根据要包含的功能设置条件定义。

如果客户想要/支付额外功能,您只需将其添加到该客户端项目文件中的条件定义。

这类似于模块方法(BPL / DLL),但避免了必须部署/管理额外文件的额外成本。缺点是功能集在编译时是固定的。

使用BPL / DLL,您可以在运行时动态加载其他模块,但如果在您的情况下这不重要,那么条件定义可能是一个不错的选择。

当然,如果你的功能不容易分离,那么你可以在代码中得到很多IFDEF,但是你的问题是功能明显分离,这也是模块的问题。