C#WPF Prism - 在不同模块之间共享相同的对象(项目)

时间:2017-12-20 18:44:52

标签: c# wpf prism

我的棱镜项目中有多个模块(每个模块位于不同的项目中)。我想在每个模块之间共享一个相同的对象。 例如,假设我有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类是否也可以使用它?

我正在尝试编写干净且易于管理的代码。

谢谢。

3 个答案:

答案 0 :(得分:1)

您可以使用事件聚合

Prism Library提供了一种事件机制,可以在应用程序中松散耦合的组件之间进行通信。此机制基于事件聚合器服务,允许发布者和订阅者通过事件进行通信,但仍然没有直接引用彼此。

链接Esoteric software documentation which developed Kryo

Communicating Between Loosely Coupled Components

Prism

答案 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类也可以使用它?

管理员课程可以使用该服务。

注意:

  1. ICommonService更改时,您应该提供一种通知MyOrder其他消费者的方法。示例:通过事件聚合器实现INotifyPropertyChanged或发布MyOrderChanged事件

  2. 通常情况下,任何能够访问服务的人(阅读:知道界面)都应该被允许这样做。最好是限制接口的可访问性(通过将其置于单独的程序集中),而不是限制服务的可访问性(通过文档),因为前者是由编译器强制执行的。