我正在使用Prism模式设计复合WPF / MVVM应用程序。我已经阅读了WPF的Developer's Guide to Microsoft Prism Library 5.0,我熟悉所描述的大多数模式。
我的应用程序模块将包含许多二进制文件(dll-s),其中一些将包含共享库,它将定义公共接口 MVVM模型,事件聚合器的事件类和该模块实现的服务。其他模块可以引用这样的库,并通过公共接口和IoC使用其模型,事件和服务。
我们说 ModuleA.Shared 共享库包含 SampleModel 和 SampleService 的公共接口,该接口执行< EM>的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 由第三方分发,其二进制文件保持不变。
由于 ModuleA 和 ModuleB 现在使用不同版本的 ModuleA.Shared.ISampleModel 进行编译,我认为IoC解析不会成功并且申请将以例外结束。
我要问的是解决此类问题的良好做法/模式是什么?如何在不破坏对依赖于它们的第三方模块的支持的情况下使某些模块可以升级,并使用旧版本的共享库构建?
答案 0 :(得分:1)
这完全取决于您是否使用棱镜。您正在提供插件api(通过使用棱镜模块取消),您必须计划对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
,则可以决定继续使用ISampleModelV2
或切换到NewProp
。当然,您的应用必须支持它们。
随着api版本数量的增加,迟早会变得丑陋,你可能想要弃用旧版本,例如如果您的应用程序从2.5到3.0,您可以删除对api 1.x的支持......但请务必尽早将这些决定传达给客户和第三方。
顺便说一句:
棱镜无法解决的挑战 [...]应用程序版本控制