C# - Prism for WPF - 公共模块的库升级策略

C# - Prism for WPF - Common modules' libraries upgrading strategy

我正在设计一个使用 Prism 模式的复合 WPF/MVVM 应用程序。我已经阅读了 WPF 的 Developer's Guide to Microsoft Prism Library 5.0,并且我熟悉所描述的大部分模式。

我的应用程序的模块将包含许多二进制文件 (dll-s),其中一些将包含 共享库,它将定义 public 接口 到 MVVM 模型,事件 类 用于事件聚合器和该模块实现的服务。其他模块将能够引用这样的库并通过 public 接口和 IoC 使用其模型、事件和服务。

假设 ModuleA.Shared 共享库包含一个 public 接口用于其 SampleModelSampleService,它使用 SampleModel:

执行工作
namespace ModuleA.Shared
{
    interface ISampleModel
    {
       int SampleProp01 { get; set; }
       int SampleProp02 { get; set; }
    }

    interface ISampleService
    {
       ISampleModel GetSampleModelInstance();
       void SaveSampleModelInstance(ISampleModel obj);
    }
}

现在说 ModuleB(在非共享二进制文件中)使用 ModuleA 的 public 库:

namespace ModuleB.Engine
{
    class SampleClass
    {
        void SampleMethod()
        {
            ModuleA.Shared.ISampleService srvc = SomeIoCContainer.Resolve<ModuleA.Shared.ISampleService>();
            ModuleA.Shared.ISampleModel obj = srvc.GetSampleModelInstance();

            // Do some work on obj...

            srvc.SaveSampleModelInstance(obj);
        }
    }
}

好吧,现在假设 ModuleB 是由 第三方 开发和维护的(例如第三方插件)。在某个时间点,我将新的 属性 添加到 ModuleA.Shared.ISampleModel:

namespace ModuleA.Shared
{
    interface ISampleModel
    {
       int SampleProp01 { get; set; }
       int SampleProp02 { get; set; }
       int NewProp { get; set; } // <-- New property
    }

    /* ... */
}

最终用户升级了我的应用程序,所以旧的 ModuleA 的二进制文件被新的替换了。 ModuleB 由第三方分发,其二进制文件保持不变。

由于 ModuleAModuleB 现在使用不同版本的 ModuleA.Shared.ISampleModel, 我假设 IoC 解析不会成功,应用程序将以异常结束。

我想问的是解决此类问题的良好做法/模式是什么?如何在不破坏依赖于它们并使用旧版本共享库构建的第三方模块的支持的情况下使某些模块可升级?

这与你是否使用棱镜完全无关。您正在提供一个插件 api(通过使用 prism 的模块发现),并且您必须计划对您的 api.

进行版本控制

首先,api 的一个版本一旦发布,就会被冻结。你永远不能碰它(除非你想让你的第三方重新编译所有东西,至少可以说让他们和你的客户不高兴)。

而不是更改 api,发布它的新版本:

interface ISampleModelV1
{
   int SampleProp01 { get; set; }
   int SampleProp02 { get; set; }
}

变成

interface ISampleModelV2
{
   int SampleProp01 { get; set; }
   int SampleProp02 { get; set; }
   int NewProp { get; set; } // <-- New property
}

第三方随后可以决定是继续使用 ISampleModelV1 还是在需要 NewProp 时切换到 ISampleModelV2。当然,您的应用程序必须同时支持它们。

随着 api 版本数量的增加,这迟早会变得丑陋,您可能希望弃用旧版本,例如如果您的应用从 2.5 升级到 3.0,您可以删除对 api 1.x 的支持...不过,请务必尽早将这些决定传达给客户和第三方。

顺便说一句:

Challenges Not Addressed by Prism [...] Application versioning