Как я могу экспортировать и импортировать сервисы приложений, скажем, MEF? - PullRequest
5 голосов
/ 31 марта 2010

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

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

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

альтернативный текст http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

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

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

Ответы [ 2 ]

3 голосов
/ 31 марта 2010

Службы приложений, с точки зрения 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;
     }

     // ...
}

Затем вы включили бы эту услугу непосредственно в ваше приложение.

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

0 голосов
/ 31 марта 2010

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

...