Получение информации от ленивых инициализированных экспортов - PullRequest
0 голосов
/ 08 апреля 2019

Я хочу привязать коллекцию (импортированную по соглашению MEF2) IEnumerable<Lazy<IModule>> к меню.

IModule - это интерфейс для ViewModels, расположенных во внешнем проекте.

Моя проблема в том,с Lazy<T> я не могу понять, как я могу получить MenuName (и к какому MenuParent он принадлежит, если таковой имеется) без создания экземпляра объекта, и это противоречит цели Lazy Initialization (существует множество модулей и каждый пользователь нуждаетсяиспользовать очень небольшое количество).Я использую Caliburn.Micro для MVVM.

Я думал о сохранении структуры меню в базе данных, но это добавленные точки отказа, когда другие разработчики создают новые модули или удаляют устаревшие модули, и похоже на жесткое кодированиеmenu.

MEF Export:

RegistrationBuilder builder = new RegistrationBuilder()
builder.ForTypesDerivedFrom<IModule>.Export<IModule>

MenuViewModel:

private IEnumerable<Lazy<IModule>> _modules;

public MenuViewModel(IEnumerable<Lazy<IModule>> modules)
{
    _modules = modules;
}

public IEnumerable<Lazy<IModule>> Modules
{
    get { return _modules; }
    set { _modules = value; }
}

Я остановился здесь, потому что не к чему привязываться.Lazy<IModule> не содержит никакой информации о типе, связанном с ним.

Я ищу стратегию, позволяющую экспортировать MEF сторонних плагинов, названия которых я могу отображать в меню, безжесткое кодирование меню.

1 Ответ

1 голос
/ 15 апреля 2019

Свойство Value Lazy<IModule> инициализирует и возвращает IModule, но, конечно, вам необходимо создать его экземпляр, чтобы иметь возможность получить от него любую информацию.

Вместо использования Lazy<T> вы можете привязать к некоторому облегченному объекту модели вида. Это означает, что вам придется создать дополнительный тип для каждого модуля, но это не должно быть проблемой, учитывая ваши требования.

...