Architektura podobna do wtyczki in.NET

Próbuję zaimplementować aplikację podobną do wtyczki. Wiem, że istnieje już kilka rozwiązań, ale to będzie tylko dowód koncepcji, nic więcej. Chodzi o to, aby aplikacja główna aplikacja prawie featureless domyślnie, a następnie niech wtyczki wiedzą o sobie, mając je zaimplementować wszystkie potrzebne funkcje.

Powstaje kilka problemów:

  1. chcę, aby wtyczki w czasie wykonywania wiedzieli o sobie poprzez mój podanie. To nie znaczy, że w czasie kodu nie mogli odwoływać się do innych zestawów wtyczki, więc mogą korzystać z jego interfejsów, tylko że inicjalizacja plugin-feature powinna być zawsze za pośrednictwem mojej głównej aplikacji. Na przykład: jeśli mam zarówno wtyczki x I y załadowane i Y chce korzystać z funkcji X, powinien "zarejestrować" swoje zainteresowanie choć moja aplikacja do korzystania z jego funkcji. Musiałbym mieć swego rodzaju "słownik" w mojej aplikacji, w której przechowuję wszystkie załadowane wtyczki. Po zarejestrowaniu się na zainteresowanie moją aplikacją, plugin Y dostałby odniesienie do X, więc mógłby go użyć. Czy to dobre podejście?
  2. podczas kodowania wtyczki Y, która używa x, musiałbym odwołać się do zestawu X, aby móc programować na jego interfejsie. To kwestia wersjonowania. Co zrobić, jeśli kod mojej wtyczki Y przeciwko nieaktualnej wersji wtyczki X? Czy zawsze powinienem używać "centralnego" miejsca, w którym znajdują się wszystkie zespoły, mając zawsze aktualne wersje zespołów?

Czy są przypadkiem jakieś książki, które specjalnie zajmują się tego rodzaju projektami dla. NET?

Thanks

Edit: myślę, że ludzie odchodzą od 2 pytań, które postawiłem. Mogę przyjrzeć się zarówno MEF, jak i # develop, ale chciałbym uzyskać konkretne odpowiedzi na postawione pytania.

Author: devoured elysium, 2010-05-08

5 answers

Spójrz w Przestrzeń nazw System.AddIn. Jest to nieco niższy poziom niż MEF, więc powinno dać ci doświadczenie" zaimplementuj to sam", którego szukasz.

 3
Author: Joel Coehoorn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 21:59:19

Polecam zajrzeć do MEF . Jest to nowy sposób robienia wtyczek w .NET. jest to zalecany sposób robienia nowych dodatków na przykład dla VS2010. Sam go nie używałem, ale to, co sprawdziłem, wygląda świetnie. Dodam to jako odpowiedź na pytanie innych:)

 6
Author: Matt Greer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 23:38:14

Jest dobra książka na temat budowania tego, czego szukasz: rozcinanie aplikacji C#: Inside SharpDevelop. Oto link: http://www.icsharpcode.net/OpenSource/SD/InsideSharpDevelop.aspx

Aplikacja SharpDevelop jest w pełni oparta na wtyczkach, a książka opowiada o tym, jak ją zbudowali, pułapkach, z którymi się zmierzyli i jak ją pokonali. Książka jest swobodnie dostępna na stronie, lub można ją kupić.

 2
Author: Garo Yeriazarian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 22:39:29

Kiedyś zrobiłem to używając tego przykładu . Podobało mi się, ale to było kilka lat temu, myślę, że teraz mogą być lepsze rozwiązania. O ile pamiętam podstawową ideą było to, że w twoim programie jest klasa abstrakcyjna, a twoje wtyczki dziedziczą tę klasę i są kompilowane jako biblioteki DLL... lub coś podobnego za pomocą interfejsów. W każdym razie, to podejście działało świetnie dla mnie. Później dodałem filesystemwatcher, aby mógł załadować te wtyczki DLL, gdy jest uruchomiony.

Aby załadować Assembly

Aby uzyskać typy, montaż eksponuje

 1
Author: m0s,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-07 22:25:13

O dwóch konkretnych problemach, które ujawniłeś:

1) nie jestem pewien, co próbujesz osiągnąć, ale domyślam się, że chcesz mieć leniwe inicjowanie funkcji, a może leniwe Ładowanie dodatków. Jeśli taki jest cel, to co proponujesz może zadziałać. Więc może działać tak:

  • wtyczka y dostarcza listę funkcji, z których musi korzystać (można to zrobić na przykład poprzez konkretną implementację interfejsu lub poprzez manifest xml).
  • The X add-in implementuje API, które umożliwia inicjalizację funkcji za pomocą metody Initialize (featureId) .
  • aplikacja hosta pobiera listę funkcji wymaganą przez Y, ładuje / inicjalizuje wtyczkę X i wywołuje Initialize dla każdej funkcji.
  • aplikacja hosta zapewnia również metodę GetFeature () , której Y może użyć, aby uzyskać odniesienie do obiektu 'feature', który byłby zaimplementowany w X.

Jeśli jednak wtyczka Y ma bezpośredni dostęp do API X, Myślę, że nie jest konieczne posiadanie całej tej infrastruktury do rejestrowania funkcji. Y może po prostu uzyskać dostęp do funkcji X bezpośrednio za pomocą X API, A Y zajmie się leniwą inicjalizacją każdej funkcji, gdy jest to wymagane. Na przykład, Y może po prostu wywołać SomeXFeature.DoSomething (), a implementacja tej klasy zainicjalizowałaby tę funkcję przy pierwszym użyciu.

2) jeśli API zestawu ulegnie zmianie, każdy zestaw może ulec awarii. Wtyczki są tylko złożeniami, które zależą na innych zgromadzeniach, więc będą one również złamać. Oto kilka rzeczy, które możesz zrobić, aby złagodzić ten problem.

  • Przypisz numer wersji do każdej wtyczki. To może być tylko Wersja montażowa.
  • podczas ładowania wtyczki upewnij się, że wszystkie zależności mogą być prawidłowo spełnione (tzn. wszystkie wtyczki, od których zależy, muszą być obecne i mieć wymaganą wersję). Odmówić załadowania wtyczki, jeśli zależności nie mogą być spełnione.
  • zaimplementuj narzędzie do zarządzania wtyczkami, aby być używany do wszystkich operacji instalacji/deinstalacji wtyczki. Menedżer może sprawdzać zależności i zgłaszać błędy podczas próby instalacji wtyczek z niezaspokojonymi zależnościami lub podczas próby odinstalowania wtyczki, od której zależą inne wtyczki.

Podobne rozwiązania są stosowane przez Mono.Addins framework. W Mono.Addins, każdy dodatek ma numer wersji i listę dodatków/wersji, od których zależy. Podczas ładowania dodatku silnik dodatku zapewnia, że wszystkie zależne dodatki z poprawnymi wersjami są również ładowane. Zapewnia również API i narzędzie wiersza poleceń do zarządzania instalacją dodatków.

 0
Author: Lluis Sanchez,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-08-06 17:58:46