0

我需要帮助转换以下类以在我正在开发的程序中使用。原来是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");
    //}

  }
}
4

1 回答 1

0

a 上的两个对应方法CompositionContainerComposeExportedValue<T>(...),它允许您将特定实例添加到容器中,并从容器GetExportedValue<T>(...)中获取 的实例T

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

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

    }
}
于 2011-09-25T07:13:58.257 回答