【问题标题】:C# - Prism for WPF - Common modules' libraries upgrading strategyC# - Prism for WPF - 通用模块库升级策略
【发布时间】:2016-11-27 08:30:00
【问题描述】:

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

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

假设 ModuleA.Shared 共享库包含一个用于其 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 的公共库:

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 解析不会成功,并且应用程序将以异常结束。

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

【问题讨论】:

    标签: c# wpf module prism versioning


    【解决方案1】:

    这与您是否使用棱镜完全无关。您正在提供一个插件 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 的支持...不过,请务必尽早将这些决定传达给客户和第三方。

    顺便说一句:

    Prism 未解决的挑战 [...] 应用程序版本控制

    【讨论】:

    • 一个很好的答案,非常感谢!您描述的解决方案效果很好。出于好奇 - 您是否知道针对复合应用架构的任何其他版本控制策略?
    • 不是真的,最终问题是你需要多久提供一次新的api,以及你需要支持旧的api版本多长时间。这是产品管理必须与支付开发费用的人讨论的事情......
    猜你喜欢
    • 1970-01-01
    • 2020-03-14
    • 2014-01-18
    • 2011-04-16
    • 1970-01-01
    • 2011-05-08
    • 2021-04-17
    • 2011-04-20
    • 1970-01-01
    相关资源
    最近更新 更多