替换应用程序存储库程序集的推荐方法

Recommended way of replacing an application's repository assembly

我有一个包含存储库程序集的应用程序。最初安装应用程序时,存储库非常简单:本地 JSON 文件存储。但我想让我的最终用户能够使用不同的存储库存储(SQL、Oracle 等)。

是否会像用新的存储库 DLL 替换应用程序目录中的原始存储库 DLL 一样简单?如果是这样,用户是否会简单地将新的存储库 DLL 复制并粘贴到应用程序的目录中,覆盖原始 DLL?有更好的方法吗?

请注意,我在应用程序中还有另一个程序集,其中包含应用程序使用的所有接口(这是一个好习惯吗?)。应用程序将验证存储库程序集是否实现了所有必需的接口。

我相信我不想要插件architecture/framework。我不希望能够从一组加载的存储库程序集中选择一个。但我会听取任何支持我的应用程序的插件策略的论点。

这个问题有几种方法,从这个问题我不确定哪一种更适合你的需要。

  1. 如果您只需要 select 位于可在应用程序启动时加载的 DLL 中的多个实现中的一个行为,您可以静态引用这些。在启动时,您可以浏览 AppDomain 以查找已加载的程序集(检查 AppDomain.GetAssemblies() 方法)和程序集中的 类 并构建一个可用的字典 behaviors.This 字典稍后可用于在两者之间切换行为。

  2. 如果您确实需要让用户在运行时处理 DLL 文件,请选中 AppDomain.Load() methods.These 允许在当前 AppDomain 中动态加载新程序集。这些程序集中的类可以转换为相应的公共接口来实际调用。但是,请注意,加载一个程序集很容易,但卸载一个程序集(如果您需要这样做)则不然。

  3. 因此,如果您需要动态加载和卸载程序集,这些需要在不同的 AppDomain 中处理(检查 AppDomain.Unload() 方法)。此外,AppDomains 之间的方法调用不能直接完成,这些需要编组,这增加了代码复杂性。

这是对这些解决方案的简要总结,还有文章详细介绍了每一个...