【问题标题】:C# WPF Prism - Share a same object between different modules(project)C# WPF Prism - 在不同模块(项目)之间共享相同的对象
【发布时间】:2017-12-20 18:44:51
【问题描述】:

我的 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 类。 应该只 View Model 类使用 ICommonService 还是我的 Manager 类也可以使用它?

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

谢谢。

【问题讨论】:

标签: c# wpf prism


【解决方案1】:

这是在模块之间共享同一对象的正确方式吗?

是的。

应该只 View Model 类使用 ICommonService 还是我的 Manager 类也可以使用它?

经理类可以使用该服务。

注意事项:

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

  2. 通常,任何可以访问服务的人(阅读:知道接口)都应该被允许这样做。限制接口的可访问性(通过将其放在单独的程序集中)比限制服务的可访问性(通过文档)更好,因为前者是由编译器强制执行的。

【讨论】:

    【解决方案2】:

    您可以使用事件聚合

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

    链接Communicating Between Loosely Coupled Components

    Prism

    Sample

    【讨论】:

    • 不是用于模块之间通信的事件聚合吗?就像发布事件后立即执行某些工作一样?但就我而言,我的每个模块仅在需要时才需要使用数据。
    【解决方案3】:

    定义模块时,应在该模块的构造函数中指定依赖项。例如:

    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));
       }
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2021-05-01
      • 2019-05-18
      • 1970-01-01
      • 2022-01-06
      相关资源
      最近更新 更多