none
Prism4 Module之间的数据共享? RRS feed

  • 问题

  • DLL是目录加载

    IOC用的是MEF

    出于需要,现在设计是这样的:

    ModuleA:数据的获取

     

    ModuleB:获取ModuleA得到的数据,在view上显示,要如何做,类似B的view把A当作数据源?

     

    现在的实现是

     

    public interface IObservableItems
      {
        ObservableCollection<MyInfo> MyItems { get; }
      }
    
    //模块A
    [ModuleExport(typeofModuleA))]
      public classModuleA : IModule, IObservableAlarm
    {
        #region IModule Members
         public void Initialize()
        {
          this.MyItems = new ObservableCollection<AlarmInfo>();
        
          //获取数据
          
        }
        #endregion
    
    
        #region IObservableAlarm Members
    
        [Export(typeof(IObservableItems))]
        public ObservableCollection<MyInfo> MyItems { get; private set; }
    
        #endregion
    }
    
    //模块B
    [ModuleExport(typeof(BModule))]
      public class BModule: IModule
      {
        private readonly IRegionManager regionManager;
    
        [ImportingConstructor]
        public BModule(IRegionManager regionManager)
        {
          this.regionManager = regionManager;
        }
    
    
        #region IModule Members
    
        public void Initialize()
        {
          regionManager.RegisterViewWithRegion(RegionNames.MyListRegion, typeof(BView));
        }
    
        #endregion
      }
    
    
    [Export(typeof(BViewModel))]
      [PartCreationPolicy(CreationPolicy.NonShared)]
      public class BViewModel: NotificationObject
      {
    //这里ViewModel中如何获得模块A的数据??
        [ImportingConstructor]
        public AlarmListViewModel()//IObservableItems observableItems)
        {
          
          
        }
        
      }
    

     

    2010年12月16日 2:48

答案

  • 不一定对,我先说说感觉。

    我觉得首先不要把Prism看问题的方式和MEF的那一套混杂在一起。不妨先把MEF忘掉。
    Prism应用可以组合一个个Module,那么某个Module通过IModule接口声明自己是Module,这就够了,别让它再去担别的责任。

    public class ModuleA : IModule, IObservableAlarm,这个IObservableAlarm让别的类实现岂不更好吗?谁说Module内只允许存在一个类的?

    [Export(typeof(IObservableAlarm))]
    public class AnotherClassInModuleA : IObservableAlarm
    {
    
    }


    然后ModuleB依赖ModuleA,这个按需要,可要可不要。

    [ModuleExport(typeof(ModuleB), DependsOnModuleNames= new string[] { "ModuleA" })]
    public class ModuleB : IModule
    {
    //...
    }
    


    ModuleB里的ViewModel可以Import这个IObservableAlarm,这时候才让MEF帮你找实现。

    [ImportingConstructor]
    public ModuleBViewModel(IObservableAlarm dataService)
    {
    
     // dataService.MyItems;
    }
    

     

     

     

    • 已标记为答案 dk.huang 2010年12月20日 0:50
    2010年12月19日 20:59

全部回复

  • 不一定对,我先说说感觉。

    我觉得首先不要把Prism看问题的方式和MEF的那一套混杂在一起。不妨先把MEF忘掉。
    Prism应用可以组合一个个Module,那么某个Module通过IModule接口声明自己是Module,这就够了,别让它再去担别的责任。

    public class ModuleA : IModule, IObservableAlarm,这个IObservableAlarm让别的类实现岂不更好吗?谁说Module内只允许存在一个类的?

    [Export(typeof(IObservableAlarm))]
    public class AnotherClassInModuleA : IObservableAlarm
    {
    
    }


    然后ModuleB依赖ModuleA,这个按需要,可要可不要。

    [ModuleExport(typeof(ModuleB), DependsOnModuleNames= new string[] { "ModuleA" })]
    public class ModuleB : IModule
    {
    //...
    }
    


    ModuleB里的ViewModel可以Import这个IObservableAlarm,这时候才让MEF帮你找实现。

    [ImportingConstructor]
    public ModuleBViewModel(IObservableAlarm dataService)
    {
    
     // dataService.MyItems;
    }
    

     

     

     

    • 已标记为答案 dk.huang 2010年12月20日 0:50
    2010年12月19日 20:59
  • 非常感谢

    自己也觉得这两套东西理解的有点混乱

    2010年12月20日 0:51