Нужна помощь в преобразовании модуля PRISM Unity Module Init в модуль PRISM MEF Init - PullRequest
0 голосов
/ 25 сентября 2011

Мне нужна помощь в преобразовании следующего класса для использования в программе, которую я разрабатываю. Первоначально это была демонстрационная программа от IdeaBlade под названием "PRISM EXPLORER", основанная на Unity. Мне нужна помощь в преобразовании одной части из UNITY в MEF. Я занимался всем остальным. Просто застрял на этом. Я уже пометил свои классы с помощью MEF «[EXPORT (typeof (XXX))]» и думаю, что мне нужно как-то использовать «ComposeExportedValue» Запутанная часть находит эквивелант для этой линии:

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

СПАСИБО!

Ниже приводится весь класс, который мне нужно преобразовать. Вы можете найти оригинал здесь: Страница PRISM Ideablade

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

  }
}

1 Ответ

0 голосов
/ 25 сентября 2011

Два соответствующих метода для CompositionContainer: ComposeExportedValue<T>(...), который позволяет добавить конкретный экземпляр в контейнер, и GetExportedValue<T>(...), который получает экземпляр T из контейнера.

Если вы можете спроектировать ваши типы таким образом, чтобы уменьшить использование служебного местоположения и попытаться отдать предпочтение внедрению конструктора, это значительно облегчит поддержку и тестирование вашего кода.Например, может ли ваш код быть преобразован в:

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

    }
}
...