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