我有一个包含存储库程序集的应用程序。最初安装应用程序时,存储库非常简单:本地 JSON 文件存储。但我想让我的最终用户能够使用不同的存储库(SQL、Oracle 等)。
它会像用新的存储库 DLL 替换应用程序目录中的原始存储库 DLL 一样简单吗?如果是这样,用户是否会简单地将新的存储库 DLL 复制并粘贴到应用程序的目录中,覆盖原始 DLL?有没有更好的方法来做到这一点?
请注意,我在应用程序中还有另一个程序集,其中包含应用程序使用的所有接口(这是一个好习惯吗?)。应用程序将验证存储库程序集是否实现了所有必需的接口。
我相信我不想要插件架构/框架。我不希望能够从一组加载的存储库程序集中选择一个。但是我会听取任何支持我的应用程序的插件策略的论点。
有几种方法可以解决这个问题,从问题中我不确定哪一种更适合您的需求。
如果您只需要在位于应用程序启动时加载的 DLL 中的多个实现中选择一个行为,您可以静态引用这些。启动时,您可以浏览 AppDomain 以获取加载的程序集(检查 AppDomain.GetAssemblies() 方法)和程序集中的类,并构建可用行为字典。此字典以后可用于在行为之间切换。
如果您确实需要在运行时让用户处理 DLL 文件,请检查 AppDomain.Load() 方法。这些方法允许在当前 AppDomain 中动态加载新程序集。这些程序集中的类可以转换为相应的公共接口以进行实际调用。但是,请注意,加载程序集很容易,但卸载程序集(如果需要)则不然。
因此,如果您需要动态加载和卸载程序集,则需要在不同的 AppDomain 中处理这些程序集(检查 AppDomain.Unload() 方法)。此外,AppDomains 之间的方法调用不能直接完成,这些需要编组,这增加了代码的复杂性。
这是这些解决方案的简要总结,有文章详细介绍了每个解决方案......
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句