Buduję aplikację opartą na .NET i chcę umożliwić bardziej rozciągliwy i wtykowy projekt.Zezwalanie na wtyczki C# na haki aplikacji
Dla uproszczenia, wniosek naraża zestaw operacji i zdarzeń:
- doSomething()
- DoOtherThing()
- onError
- onSuccess
I chciałby zaoferować "wtyczki" do załadowania i podpięcia do niektórych z tych operacji (coś w stylu: Po uruchomieniu Event1 uruchom plugin1).
Na przykład - uruchomić plugin1.HandleError() gdy Zdarzenie onError.
Można to łatwo zrobić z subskrypcji zdarzeń:
this.OnError += new Plugin1().HandleError();
Problem polega na tym, że:
- Moja aplikacja nie zna typu "Plugin1" (jest to plugin, moim aplikacja nie odnosi się bezpośrednio).
- To zrobi instancję wtyczki przed czasem, coś, czego nie chcę, aby chcę zrobić.
W „tradycyjnych” modeli wtyczki, aplikacja („Klient” wtyczek) ładuje i wykonuje kod wtyczki w niektórych kluczowych przykład points.For - aplikacja przetwarzanie obrazu, gdy pewna operacja jest wykonywana).
Kontrola, kiedy należy utworzyć kod wtyczki i kiedy ją wykonać, jest znana aplikacji klienckiej.
W mojej aplikacji wtyczka sama decyduje, kiedy należy ją wykonać ("Wtyczka powinna się zarejestrować w zdarzeniu OnError").
Zachowanie kodu "wykonanie" wtyczki obok kodu "rejestracyjnego" stwarza problem, który DLL wtyczki zostanie załadowany do pamięci w czasie rejestracji, coś, co chcę zapobiec.
Na przykład, jeśli dodaję metodę Register() w bibliotece DLL wtyczki, DLL wtyczki będzie musiał zostać załadowany do pamięci, aby można było wywołać metodę Register.
Co może być dobrym rozwiązaniem dla tego konkretnego problemu?
- Łagodne ładowanie (lub oferowanie leniwego/gorliwego ładowania) bibliotek DLL wtyczek.
- Zezwalanie wtyczek na kontrolowanie różnych elementów systemu/aplikacji, do których się podłączają.
Wada tej strategii jest bardzo powolna podczas ładowania zespołu. Jest to typowe zagadnienie do refleksji w .Net –
Dzięki już wiem, jak to zrobić. Chciałbym zaprojektować sposób, aby wtyczka rejestrowała się w określonych zdarzeniach, bez wcześniejszego ładowania. –
Nie sądzę, że jest to możliwe, aby dll wtyczki zrobił * cokolwiek *, dopóki nie zostanie załadowany. Jednym z rozwiązań jest umieszczenie klasy definicji wtyczki w każdym zestawie wtyczek, który konfiguruje wtyczkę/mówi hostowi o jej możliwościach. Po uruchomieniu aplikacji można znaleźć wszystkie klasy definicji i podjąć odpowiednie działanie (może po prostu wywołanie metody "Konfiguruj" na każdym z nich). –