【问题标题】:Customize c# WinForm application for multiple customers为多个客户定制 c# WinForm 应用程序
【发布时间】:2011-06-11 08:44:15
【问题描述】:

想想这个场景:

我有一个 c# windows 窗体应用程序。这个应用程序对我所有的客户都是一样的。现在他们中的一个需要修改一个表单,添加新的文本框和新的逻辑。

我显然不想复制我的应用程序,插入带有 customer-Id 的 IF 语句来控制逻辑可以很容易地变成意大利面条式的代码。

我认为在这种情况下我可以为每个客户创建一个单独的 dll 项目;在里面我可以编写自定义表单实现与默认表单相同的接口(逻辑类也相同),我可以尝试通过配置文件切换这些 dll 或使用正确的客户 dll 构建项目(或使用例如 Windsor Castle for DI )。

这是一个有效的模式吗?存在不同的方式?

更新

我尝试列出:

【问题讨论】:

  • MEF vs IOC/DI 上查看此答案。我认为 MEF 或 DI 会为你工作。就个人而言,我会使用 Autofac,但我有偏见。

标签: c# dependency-injection mef autofac multi-tenant


【解决方案1】:

我认为在这种情况下,MEF 会是更好的选择。 Castle 更像是一个业务逻辑的 DI 引擎,对于控制对象生命周期很有用,尤其是当您希望能够切换程序的工作方式时(多个小线程或一个线程中的单个大操作)。
另一方面,MEF 使您无需为此类配置添加配置文件。您只需使用库进行操作。我认为 MEF 最适合客户端 GUI 表单。

【讨论】:

  • 温莎城堡启用 DI。但是,这不仅限于业务逻辑,无需配置即可完成。 Autofac 也是如此。因此,您在此答案中推荐 MEF 的原因似乎具有误导性。另外,当您说“一个线程中的多个小线程或一个大型操作”时,我不明白您的意思。你能扩展一下吗?
  • 我没有写它仅限于BL,只是我觉得它更适合。您可以将 DI 硬编码,也可以在配置文件中(我认为配置文件更灵活)。使用 MEF,您可以实现其他目标 - 您可以控制必须加载的内容,只需提供适当的库,无需修改任何文件。插件之类的。在很多情况下,您需要在 GUI 中使用此功能,并且当它是整个客户端应用程序的一部分时,它最适合 BLL。
  • 至于线程......我确实遇到过在 BLL 中并行化进程导致一些异常的情况,我没有时间解决。因此,我编写了 2 个相同功能的实现,并且在应用程序配置文件中更改组件的生活方式没有问题。
  • 您确实说“Castle 更像是 业务逻辑 的 DI 引擎”,因此我发表了评论。此外,您可以使用 Autofac 等容器实现非配置、非修改插件,例如Autofac scanning。对于这个问题,所有这些都可能是矫枉过正,除非正在进行大量自定义。
  • 为了清楚起见,我并不是说 MEF 是 错误 的答案。我只是指出,您引用的更喜欢 MEF 的原因在我看来是有缺陷的,并且可能具有误导性。另外,Windsor supports scanning functionality 类似于 Autofac。
【解决方案2】:

如果您正在开发multitenant 应用程序,则有像Autofac 这样的DI 框架支持这种自定义。看看this article

您还可以使用源代码控制系统来帮助您。当您需要自定义时,创建一个分支并在那里进行自定义,这样您就不必复制代码了。

【讨论】:

  • 我看到温莎也支持多租户!但是,您是在建议我使用 Autofac 吗?
  • 不,他建议您使用 DI 容器。任何容器都可以工作,但 Autofac 有关于开发多租户应用程序的有用文档。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-11-13
  • 1970-01-01
  • 1970-01-01
  • 2018-07-31
  • 1970-01-01
相关资源
最近更新 更多