2010-03-31 16 views
5

Obecnie pracuję z MEF, ale odpowiedź, której szukam, prawdopodobnie nie ma znaczenia dla MEF - to zastrzyk zależności - używam po prostu tutaj terminologii MEF.Jak eksportować i importować usługi aplikacji za pomocą MEF?

Krótka historia tło, czytałem ten artykuł na co MSDN z naciskiem na Composite Applications

Na tym rysunku jest trzy rzeczy, powłoka, usługi aplikacyjne i moduły. To jest złożona aplikacja.

alt text http://i.msdn.microsoft.com/cc785479.fig02(en-us).gif

Co ja nie do końca się to część usługi aplikacyjne. Jaka jest usługa, jak ona wygląda? W jaki sposób ujawniasz usługę za pośrednictwem modułu i jak korzystasz z usługi z innego modułu?

Naprawdę chciałbym zobaczyć kilka zgrabnych przykładów małych kodów, nic szczególnego, ale coś do zilustrowania, jak to wszystko się ożywa (część usług aplikacji).

+5

Moje oczy, MOJE OCZY! –

+0

Tak, wybór kolorów na tym zdjęciu jest okropny ... –

Odpowiedz

3

Usługi aplikacji, jeśli chodzi o MEF, są po prostu częścią składową. Każdy interfejs lub klasa, którą możesz skomponować, może działać jak usługa.

Każda usługa będzie zawierała interfejs lub klasę podstawową, którą chcesz zaimplementować. Możesz zrobić to masowo za pomocą jakiegoś interfejsu IService (i zaimportować je wszystkie za pomocą [ImportMany]), ale często będziesz potrzebować różnych typów usług.

Następnie należy zaimportować to, zgodnie z wymaganiami, do zajęć. Na przykład, można powiedzieć, mają wspólną bibliotekę interfejsu dla usług, a także podać:

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

Następnie można mieć osobne konkretne typy eksportowych Biblioteka:

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

Twój główny program będzie wówczas w stanie zaimportuj go w razie potrzeby i napisz do niego kod. Załóżmy na przykład, że chcesz wyświetlać klientów, musisz załadować klientów z warstwy danych. Jeśli chcesz, aby załadować poprzez repozytorium, można zaimportować repozytorium do określonej części aplikacji:

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

    // ... 
} 

Można by wtedy uzyskać usługa ta składa się bezpośrednio do danej aplikacji.

Jest to uważane za "usługę aplikacji", ponieważ jest to implementacja specyficzna dla aplikacji dla niektórych usług ogólnych - nie jest to składnik związany z widokiem i może być używany w całej aplikacji.

+0

Jeśli więcej niż jedna usługa aplikacji spełnia import, jak byście się rozróżnili? metadane? Czy jest jakiś lepszy sposób? czy to po prostu źle.Wiem, że MEF zgłasza wyjątek, kiedy tak się dzieje, więc czy naprawdę chcę tylko 1 interfejs i 1 konkretną implementację? –

+0

@John: Musisz użyć [ImportMany], a następnie albo przetestować usługę, albo użyć metadanych, aby określić, którego użyć. W przeciwnym razie otrzymasz wyjątek. –

+0

@John: Jeśli wiele usług korzysta z tego samego interfejsu/klasy importowania, użyj [ImportMany] i zaimportuj do IEnumerable

0

Deklaracja interfejsu dla usługi i klasy eksportu implementującej ten interfejs. Na przykład możesz mieć IPersonBuilder, zadeklarowane we wspólnym zestawie. Jesteś głównym modułem implementującym interfejs MyPersonBuilder i eksportujesz go. Wszystkie widoki korzystają z importu IPersonBuilder, aby wywołać metodę, a przy użyciu kompozycji MEF będą mogły wywoływać numer CreatePerson() na twoim MyPersonBuilder z twojego głównego modułu.

Powiązane problemy