为多个客户定制C# WinForm应用程序

5

想象这样的情境:

我有一个C#窗体应用程序。这个应用程序对于所有客户都是相同的。现在其中一个客户需要修改一个表单,添加新的文本框和新的逻辑。

显然,我不想复制我的应用程序,并且插入带有客户ID的IF语句来控制逻辑很容易导致代码混乱。

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

这是一种有效的模式吗?是否存在不同的方法?

更新

我尝试列出:


1
请参考这篇关于MEF vs IOC/DI的回答。我认为MEF或DI都可以适用于您的情况。个人而言,我会使用Autofac,但这是我的偏见。 - bentayloruk
2个回答

3
我认为在这种情况下,MEF 是更好的选择。Castle 更像是一个业务逻辑的 DI 引擎,有助于控制对象的生命周期,特别是当您想要能够切换程序工作方式(多个小线程或一个单独的大操作在一个线程中)时非常有用。
另一方面,MEF 可以免去您添加配置文件的需要。您只需要操作库。我认为 MEF 最适合客户端 GUI 表单。

Castle Windsor可以实现依赖注入。但是,这不仅限于业务逻辑,也可以在没有配置的情况下完成。Autofac也是如此。因此,在您提供答案时推荐MEF的原因似乎有误导性。另外,我不明白您所说的“多个小线程或一个单独的大操作在一个线程中”的意思。您能详细说明一下吗? - bentayloruk
我并没有写它限制于业务逻辑层,只是我认为它更加适合。你可以将 DI 硬编码,也可以放在配置文件中(我认为配置文件更加灵活)。使用 MEF,你可以实现另一种功能——通过提供适当的库而无需修改任何文件来控制必须加载什么。有点像插件。在 GUI 中,有很多情况需要这种功能,而且大多数情况下适用于 BLL,尤其是当它是整个客户端应用程序的一部分时。 - Alex
关于线程...我曾经遇到过在BLL中并行处理进程导致一些异常的情况,但是我没有时间去解决。所以我编写了两个实现相同功能的版本,并且在应用程序配置文件中更改组件生命周期时没有出现任何问题。 - Alex
你确实说过“Castle更像是一个业务逻辑的DI引擎”,这就是我的评论。此外,您可以使用像Autofac这样的容器实现非配置、非修改插件,例如Autofac扫描。除非进行了大量的自定义,否则所有这些都可能过度复杂化这个问题。 - bentayloruk
我没有提到Autofac,因为说实话,我从来没有使用过它。也许在某些方面它更好,但对于Castle和MEF,我发现在这些情况下最好实现。至于GUI,当我进行研究时,我发现MEF是插件最受推荐的工具。不过我会研究一下Autofac。 - Alex
1
只是为了明确,我并不认为MEF是错误的答案。我只是指出,在我看来,你提到的偏爱MEF的原因是有缺陷的,并且可能会误导人。此外,Windsor支持类似于Autofac的扫描功能 - bentayloruk

1
如果您正在开发一个 多租户 应用程序,那么有像 Autofac 这样支持此类自定义的 DI 框架。可以参考 本文
另外,您也可以利用源代码控制系统来帮助您。当需要自定义时,创建一个分支并在该分支上进行自定义,这样就不必复制代码了。

我看到Windsor也支持多租户!但你是在建议我使用Autofac吗? - danyolgiax
不,他建议你使用 DI 容器。任何容器都可以,但 Autofac 有关于开发多租户应用程序的有用文档。 - Steven

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接