Wiem, że było wiele pytań dotyczących wprowadzania parametrów konstruktora za pomocą MEF, ale moje jest nieco inne.MEF: Przekazywanie różnych parametrów konstruktora do części przy użyciu CreationPolicy.NonShared
Chciałbym wiedzieć, czy istnieje sposób przekazania różnych wartości parametru do konstruktora części, gdy używam kombinacji PartCreationPolicy(CreationPolicy.NonShared)
i GetExportedValue
?
Na przykład:
[PartCreationPolicy(CreationPolicy.NonShared)]
[Export]
public partial class Foo
{
[ImportingConstructor]
public Foo([Import("SomeParam")]object parameter)
{
...
}
}
i gdzieś indziej ...
container.ComposeExportedValue("SomeParam", "Some value...");
var instance = container.GetExportedValue<Foo>();
W powyższym przykładzie, można użyć ComposeExportedValue
tylko raz, jak działa to po raz drugi będzie powodować ChangeRejectedException
.
Więc moje pytania to:
- Czy jest jakiś inny sposób, aby zmienić wartość
SomeParam
w powyższym scenariuszu dla każdej nowej instancji? - Jeśli nie, jakie są inne sposoby, w jakie można to osiągnąć bez korzystania z innych struktur DI? Jedną z rzeczy, która przychodzi mi na myśl, jest utworzenie usługi, która wyeksponuje coś takiego, jak
System.Collections.Concurrent.ConcurrentQueue
, gdzie dodaję wartość parametru przed wywołaniemGetExportedValue
, a następnie wycofam wartość w konstruktorze części. Ale to jest hack, a także stwarza więcej problemów niż rozwiązuje. - Jeśli odpowiedź na oba powyższe pytania brzmi "nie", to czy istnieją inne sposoby osiągnięcia tego przy pomocy kombinacji MEF i innych frameworków DI/IOC?
Dzięki za pomoc. :) Pozdrawiam,
Yogesh Jagota
Patrzę na AutoFac/MEF Integracji ale jak mogę obsługiwać rejestrację przy użyciu 'RegisterComposablePartCatalog'? Nie mogę użyć opcji "Zarejestruj", ponieważ jest ona automatycznie wykonywana przez AutoFac. Jak mogę powiedzieć AutoFac, że pewien eksport musi być utworzony za pomocą domyślnego konstruktora z parametrami, które dostarczam bez użycia '[ImportingConstructor]'? – Yogesh
@ Yogesh: Niektóre komponenty mogą być zarejestrowane za pomocą AutoFac (gdy wymagana jest precyzyjna kontrola), a inne eksportowane za pomocą MEF (gdy potrzebujesz dynamicznego wykrywania wtyczek). Ale nie można mieszać obu dla tego samego komponentu. Inną opcją jest całkowite przejście do AutoFac; możesz użyć opcji [Skanowanie] (http://code.google.com/p/autofac/wiki/Scanning), aby w razie potrzeby uzyskać dynamiczne wykrywanie według MEF. –
To zadziałało. Aby to zrobić, użyj metody 'Update' w' IContainer', która pozwala dodać nowe rejestracje do istniejącego kontenera. Dzięki. :) – Yogesh