我的棱镜项目中有多个模块(每个模块位于不同的项目中)。我想在每个模块之间共享一个相同的对象。
例如,假设我有Order
类,我想在我的模块中访问这个Order
对象。
目前,我实施了一个界面,并在我的Prism项目中将其注册到容器中。
public interface ICommonService{
Order GetData();
}
public class CommonService : ICommonService{
public Order MyOrder{ get; set; }
public Order GetData(){
return MyOrder;
}
public void SetData(Order order){
MyOrder = order;
}
}
我在需要MyOrder
的每个模块中使用它。
这是在模块之间共享同一对象的正确方法吗?
此外,我的View Models类包含多个Manager类。
是否只应使用ICommonService
查看模型类,或者我的Manager类是否也可以使用它?
我正在尝试编写干净且易于管理的代码。
谢谢。
答案 0 :(得分:1)
您可以使用事件聚合
Prism Library提供了一种事件机制,可以在应用程序中松散耦合的组件之间进行通信。此机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,但仍然没有直接引用彼此。
链接Esoteric software documentation which developed Kryo
答案 1 :(得分:1)
定义模块时,应在该模块的构造函数中指定依赖项。例如:
public class SomeModule : IModule
{
public SomeModule(ICommonService commonService)
{
// commonService will be shared object
}
}
在Bootstrapper
中,当您将模块添加到目录时,它将查看DI容器以查找类型。如果将其设置为全局引用,则它将对ICommonService
的所有引用使用相同的对象。
class Bootstrapper : UnityBootstrapper
{
protected override void ConfigureContainer()
{
base.ConfigureContainer();
RegisterTypeIfMissing(typeof(ICommonService),
typeof(CommonService), true); // true for register as singleton
}
protected override void ConfigureModuleCatalog()
{
base.ConfigureModuleCatalog();
ModuleCatalog module_catalog = (ModuleCatalog)this.ModuleCatalog;
module_catalog.AddModule(typeof(SomeModule));
}
}
答案 2 :(得分:1)
这是在模块之间共享同一对象的正确方法吗?
是
只有View Model类使用ICommonService还是我的Manager类也可以使用它?
管理员课程可以使用该服务。
注意:
在ICommonService
更改时,您应该提供一种通知MyOrder
其他消费者的方法。示例:通过事件聚合器实现INotifyPropertyChanged
或发布MyOrderChanged
事件
通常情况下,任何能够访问服务的人(阅读:知道界面)都应该被允许这样做。最好是限制接口的可访问性(通过将其置于单独的程序集中),而不是限制服务的可访问性(通过文档),因为前者是由编译器强制执行的。