【发布时间】: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 共享库包含一个用于其 SampleModel 和 SampleService 的公共接口,它与 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 解析不会成功,并且应用程序将以异常结束。
我要问的是解决此类问题的良好做法/模式是什么?如何在不破坏对依赖于它们并使用旧版本的共享库构建的第三方模块的支持的情况下使某些模块可升级?
【问题讨论】:
标签: c# wpf module prism versioning