Как я экспортирую и импортирую прикладные службы с, говорят MEF?

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

Короткая фоновая история, я перечитал эту статью в MSDN с вниманием на Составные приложения

В этом числе существует три вещи, оболочка, прикладные службы и модули. Таким образом, это - составное приложение.

alt text
(источник: microsoft.com)

То, что я не полностью получаю, является частью прикладных служб. Каков сервис, на что это похоже? Как Вы подвергаете сервис через модуль и как Вы используете сервис от другого модуля?

Я действительно хотел бы видеть некоторые аккуратные маленькие примеры кода, ничто не полагает, но что-то, чтобы проиллюстрировать, как все это оживает (часть прикладных служб).

5
задан Glorfindel 10 July 2019 в 13:05
поделиться

2 ответа

Прикладные сервисы, с точки зрения MEF, являются просто еще одной составной частью. Любой интерфейс или класс, который вы можете скомпоновать, может действовать как сервис.

Каждый сервис будет иметь некоторый интерфейс или базовый класс, который вы хотите реализовать. Вы можете сделать это массово через некоторый тип интерфейса IService (и использовать [ImportMany], чтобы импортировать их все), но часто вам нужны различные типы сервисов.

Затем вы импортируете их, по мере необходимости, в свои классы. Например, допустим, у вас есть общая библиотека интерфейсов для сервисов, и вы предоставляете:

public interface IDataRepostory
{
     public IList<MyType> MyTypes { get; }
}

Затем вы можете иметь отдельную библиотеку для экспорта специфических типов:

[Export(typeof(IDataRepository))]
public class Repository: IDataRepostory
{
    // implement interface for this specific "service"
}

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

public class CustomersViewModel
{
     [Import]
     public IDataRepository
     {
         get; set;
     }

     // ...
}

Тогда вы получите этот сервис, составленный непосредственно в вашем приложении.

Это считается "службой приложения", потому что это специфическая для приложения реализация некоторой общей службы - это не компонент, связанный с представлением, и он может использоваться во всем вашем приложении.

3
ответ дан 15 December 2019 в 06:21
поделиться

Объявите интерфейс для класса службы и экспорта, реализующего этот интерфейс. Например, у вас может быть IPersonBuilder , объявленный в совместно используемой сборке. У вашего основного модуля есть MyPersonBuilder , реализующий интерфейс и экспортируйте его. Все представления используют импорт IPersonBuilder для вызова метода на нем, и, используя композицию MEF, они смогут вызовите say CreatePerson () в MyPersonBuilder из основного модуля.

0
ответ дан 15 December 2019 в 06:21
поделиться
Другие вопросы по тегам:

Похожие вопросы: