2012-01-09 12 views
9

Mam klasę statyczną w moim rozwiązaniu, która jest używana do pracy z różnymi złożeniami. Chcę połączyć je przez MEF, więc zrobiłem pole w klasie.Używanie C# MEF z klasami statycznymi

[Import(typeof(A))] 
    static private A _a1; 

Wtedy mam metody, które mijam montaż nazwę jako argument:

public static A LoadPackage(string filePath) 
    { 
      var catalog = new AggregateCatalog(); 
      catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
      var _container = new CompositionContainer(catalog); 
      ??? 
    } 

Więc jest jakiś sposób teraz importować od typu montażu określone przez filePath?

nie mogę zrobić:

_container.ComposeParts(this); 

ponieważ klasa jest `statyczne i nie mogę zrobić tego

_container.ComposeParts(_a1); 

(który może być całkowicie błędne, aby rozpocząć) od A nie jakichkolwiek konstruktorów (tak _a1 jest null)

+1

Czy jest jakiś powód, dla którego musi być statyczny? Wszystko, co importujesz/eksportujesz, będzie domyślnie Singelton, co w większości przypadków jest lepsze niż posiadanie klasy statycznej. – eandersson

+0

jest to jedna z opcji, które rozważam. Powodem utrzymania go w stanie statycznym jest to, że nie chcę zmieniać kodu w całym moim projekcie (tj. - jestem leniwy +)). – noaRAVE

+0

Jestem prawie pewien, że nie można używać klas statycznych bezpośrednio z MEF, ale ja nie na pewno to wiesz. – eandersson

Odpowiedz

6

Cóż okazuje się, że metoda Szukałem jest GetExportedValue (tak, przeoczyłem podstawową funkcjonalność):

static private A _a1; 

public static A LoadPackage(string filePath) 
{ 
     var catalog = new AggregateCatalog(); 
     catalog.Catalogs.Add(new AssemblyCatalog(filePath)); 
     var _container = new CompositionContainer(catalog); 
     _a1 = _container.GetExportedValue<A>(); 
} 

i mam moje pole wypełnione (tak na wszelki wypadek, już przeniósł go do innej klasy i teraz wygląda schludnie i czysto)

+0

Nie jest to dobre rozwiązanie - jak wspomniano powyżej Wima, o wiele lepiej, aby użyć importu MEF części wspólnej i w miarę możliwości unikaj klas statycznych/metod. –

11

MEF jest przeznaczony do tworzenia i zainicjować obiektom dla Ciebie. Nie zajmuje się stanem w klasach statycznych.

Proponuję uczynić klasę i jej pola niestatycznymi i oznaczyć ją jako [PartCreationPolicy(CreationPolicy.Shared)], jeśli chcesz wymusić zachowanie singleton.

Zobacz także this other question na MEF i wzorze singleton.