Призма v4, сервис MEF - PullRequest
       24

Призма v4, сервис MEF

2 голосов
/ 08 февраля 2011

У меня есть приложение Windows WPF, которое использует элемент управления MS ленты для меню. В моем инфраструктурном проекте я хочу иметь общий сервис, на который будут ссылаться все модули. Каждый модуль будет затем использовать эту службу, чтобы определить, какие пункты меню должны отображаться для модуля.

Я прочитал это Prism + MEF: отложен экспорт службы из prism-module , но другие модули не могут распознать службу.

Услуга

namespace Infrastructure
{
    [ModuleExport("InfModule", typeof(InfModule), InitializationMode = InitializationMode.WhenAvailable)]
    [PartCreationPolicy(CreationPolicy.Shared)]
    public class InfModule : IModule
    {
        [Export(typeof(IMenuService))]
        public IMenuService MenuService { get; private set; }

        public void Initialize()
        {
            MenuService = new MenuService();

            MenuService.AddItem("test");
        }
    }
}

Модуль

namespace Classic
{
    [ModuleExport("Classic", typeof(Classic), InitializationMode = InitializationMode.WhenAvailable)]
    [ModuleDependency("InfModule")]
    public class Classic : IModule
    {
        private IRegionManager _regionManager;

        [Import(typeof(IMenuService))]
        private IMenuService menuService { get; set; }

        [ImportingConstructor]
        public Classic(IRegionManager regionManager)
        {
            this._regionManager = regionManager;

            // This shows as true
            Debug.WriteLine(menuService == null);
        }

        public void Initialize()
        {
            _regionManager.RegisterViewWithRegion("RibbonRegion", typeof(Views.RibbonTabMenu));

            // This shows as true
            Debug.WriteLine(menuService == null);
        }
    }
}

Я бы ожидал, что одна из строк отладки выведет значение false с момента ее импорта. Есть идеи, что мне не хватает?

1 Ответ

2 голосов
/ 08 февраля 2011

Импорт свойств никогда не будет установлен во время работы конструктора, поскольку вы не можете устанавливать свойства для объекта, пока он не будет построен.

Другая проблема заключается в том, что в InfModule вы устанавливаете экспортируемое значение слишком поздно. MEF просматривает значение экспорта только один раз, после чего кэширует значение и больше не вызывает метод получения. В этом случае он получает экспорт до вызова Initialize (). Логика установки экспорта должна выполняться либо из конструктора, либо из кода в свойстве getter.

...