2012-11-17 14 views

Odpowiedz

15

Jeśli szukasz, aby dodać istniejącą instancję obiektu do kontenera, można użyć metody CompositionContainer.ComposeExportedValue:

container.ComposeExportedValue<MyClass>(myClassInstance); 

rzecz jesteś naprawdę szuka chociaż jest prawdopodobnie nowa konwencja oparty na programowaniu, który pozwala tworzyć części na podstawie konwencji nazewniczych, a nie atrybutów, ale ta funkcja jest dostępna tylko w .NET 4.5.

Przykład użycia (będzie wyeksportować każdy typ w myAssembly który implementuje IController jako IController):

var registration = new RegistrationBuilder(); 

registration.ForTypesDerivedFrom<IController>() 
      .Export<IController>(); 

var catalog = new AssemblyCatalog(myAssembly, registration); 
var container = new CompositionContainer(catalog); 

Dobrym przykładem tego, jak korzystać z nowego modelu konwencji MEF za can be found here.

Mam nadzieję, że to pomoże.

+0

Doskonałe dzięki. Niestety, wygląda na to, że jest to tylko funkcja 4.5. – blue18hutthutt

+0

Przypuszczam, że oparłeś swój przykład na wersji zapoznawczej? Nie ma metody 'Implements', [zamiast] (https://msdn.microsoft.com/en-us/library/system.componentmodel.composition.registration.registrationbuilder.aspx) istnieje wiele typów' ForType'/'ForTypes 'metody. – Stijn

+1

@Stijn Masz rację, API zmieniło się od tego czasu - 'ForTypesDerivedFrom' zastąpił' Implements'. Odpowiednio zredagowałem swoją odpowiedź. –

10

Jeśli zaznaczysz interfejs z atrybutem InheritedExport, wszystkie moduły w tym katalogu są eksportowane, które realizują ten interfejs, czy są one oznaczone Export atrybutu lub nie.

Interfejs:

[InheritedExport] 
public interface IContract { ... } 

Moduł:

// No [Export] attribute 
public class ModuleImplementation : IContract { ... } 

Teraz MEF wstrzyknie moduł.

Powiązane problemy