Я работаю с MEF прямо сейчас, но ответ, который я ищу, вероятно, не важен MEF - это - все внедрение зависимости - я просто использую терминологию MEF в качестве примера здесь.
Короткая фоновая история, я перечитал эту статью в MSDN с вниманием на Составные приложения
В этом числе существует три вещи, оболочка, прикладные службы и модули. Таким образом, это - составное приложение.
(источник: microsoft.com)
То, что я не полностью получаю, является частью прикладных служб. Каков сервис, на что это похоже? Как Вы подвергаете сервис через модуль и как Вы используете сервис от другого модуля?
Я действительно хотел бы видеть некоторые аккуратные маленькие примеры кода, ничто не полагает, но что-то, чтобы проиллюстрировать, как все это оживает (часть прикладных служб).
Прикладные сервисы, с точки зрения 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;
}
// ...
}
Тогда вы получите этот сервис, составленный непосредственно в вашем приложении.
Это считается "службой приложения", потому что это специфическая для приложения реализация некоторой общей службы - это не компонент, связанный с представлением, и он может использоваться во всем вашем приложении.
Объявите интерфейс для класса службы и экспорта, реализующего этот интерфейс.
Например, у вас может быть IPersonBuilder
, объявленный в совместно используемой сборке. У вашего основного модуля есть MyPersonBuilder
, реализующий интерфейс и экспортируйте его.
Все представления используют импорт IPersonBuilder
для вызова метода на нем, и, используя композицию MEF, они смогут вызовите say CreatePerson ()
в MyPersonBuilder
из основного модуля.