需要帮助转换PRISM统一模块Init到PRISM MEF模块Init



我需要帮助转换以下类,以便在我正在开发的程序中使用。最初是IdeaBlade的一个演示程序,称为"PRISM EXPLORER",基于Unity。我需要帮助将一部分从UNITY转换为MEF。其他的都是我处理的。就盯着这个。我已经用MEF标记了我的类"[EXPORT(typeof(XXX))]",我认为我需要以某种方式使用"ComposeExportedValue"。令人困惑的部分是找到这一行的等号:

var provider = 
    (IEntityManagerProvider) _container.Resolve<IPersistenceGateway>();
  _container.RegisterInstance<IEntityManagerProvider>(provider);

谢谢!

下面是我需要转换的整个类。你可以在这里找到原文:Ideablade PRISM页面

using Microsoft.Practices.Composite.Modularity;
using Microsoft.Practices.Composite.Regions;
using Microsoft.Practices.Unity;
using PrismExplorer.Infrastructure;
namespace ModelExplorer.Explorer {
  public class ExplorerModule : IModule {
    private readonly IUnityContainer _container;
    public ExplorerModule(IUnityContainer container) {
      _container = container;
    }
    public void Initialize() {
      InitializeContainer();
      SetViews();
    }
    // ToDo: Consider getting from configuration
    private void InitializeContainer() {
      RegisterGatewayAndEntityManagerProvider();
      _container.RegisterType<IQueryRepository, QueryRepository>(
        new ContainerControlledLifetimeManager()); // singleton
    }
    private void RegisterGatewayAndEntityManagerProvider() {
      _container.RegisterType<IPersistenceGateway, PrismExplorerPersistenceGateway>(
        new ContainerControlledLifetimeManager()); // singleton
      var provider = 
        (IEntityManagerProvider) _container.Resolve<IPersistenceGateway>();
      _container.RegisterInstance<IEntityManagerProvider>(provider);
    }
    private void SetViews() {
      var regionManager = _container.Resolve<IRegionManager>();
      var view = _container.Resolve<ExplorerView>();
      regionManager.AddToRegion(RegionNames.MainRegion, view);
      regionManager.RegisterViewWithRegion(RegionNames.MainRegion, typeof(ExplorerView));
    }

    // Destructor strictly to demonstrate when module is GC'd
    //~MevModule() {
    //  System.Console.WriteLine("Goodbye, MevModule");
    //}
  }
}

CompositionContainer上对应的两个方法是ComposeExportedValue<T>(...),它允许您向容器中添加特定的实例,而GetExportedValue<T>(...)则从容器中获取T的实例。

如果你能设计你的类型来减少对服务位置的使用,并尝试使用构造函数注入,这将使你的代码更容易维护和测试。例如,您的代码是否可以转换为:

[Export(typeof(IModule))]
public class ExplorerModule : IModule
{
    [ImportingConstructor]
    public ExplorerModule(IPersistenceGateway gateway)
    {
    }
}

最新更新