C#, program główny a do niego moduły, ew. język skryptowy

0

Zamarzyło mi się stworzenie programu, który będzie się opierał o moduły czyli mniej więcej coś takiego :
Główna aplikacja
- okno modalne, moduł np. wyświetlania listy użytkowników
- okno modalne, moduł np. wyświetlania wszystkich produktów zakupionych przez użytkownika
- okno modalne, moduł np. wyświetlania produktów
- okno modalne, formularz sprzedaży produktów

Fajnie było by, gdyby istniała możliwość np. osobnego napisania modułu przez inną osobą, a ja tylko wrzucam ów moduł do katalogu np. "mod". Następnie restartuję program, i po ponownym jego uruchomieniu widzę w menu, że mam dostępny dodatkowy moduł np. korekta sprzedaży.

Ewentualnie ten "bajer" można pominąć i podpinać moduły w programie głównym - ręcznie.

Druga sprawa, to skrypty. W firmie w której pracowałem, był program główny i do niego napisane skrypty. Całość zrealizowana w object pascalu. Użytkownik mógł z poziomu głównego programu, otworzyć dany skrypt, zedytować go, następnie np. kliknąć button w głównym programie pod który podpięty był skrypt i wykonywała się wcześniej wyedytowana akcja.

Nie wiem czy jasno nakreśliłem problem, jeżeli nie - postaram się odpowiedzieć na ewentualnie pytania.
Nie mniej jednak pozostaje zasadniczy problem, przez co właśnie proszę o pomoc.

Otóż gdzie szukać informacji, jak się do tego zabrać, czego potrzebuję ? Będę wdzięczny za wszelką pomoc, linki, dema, źródła - cokolwiek.

1

Musisz wymyślić własne api, np. zmusić każdy moduł do implementacji jakiegoś interfejsu, który pozwoli ci załadować moduł. Następnie możesz wczytać dynamicznie bibliotekę(-ki) z jakiegoś katalogu, poszukać w niej klasy (klas) implementującej twój interfejs i załadować moduł(-y). Ustalasz jaki jest algorytm ładowania modułu, tzn. np. najpierw jakiś init danymi, dodawanie do menu, inicjalizacja okna modułu, ..., co tam jeszcze wymyślisz.

np.
IPlugin
{
bool AddToMenu(menu m);
bool InitWindow(...);
...
}

0

Ogarnąłem troszeczkę temat modułów. W sumie trochę źle szukałem, nie skojarzyłem słówka "plug-in".
Tak więc w sprawie pluginów można spojrzeć na : http://maciej-progtech.blogspot.com/2010/05/jak-zaimplementowac-mechanizm-wtyczek.html

Nie mniej jednak pozostaje sprawa pisania własnych skryptów :/

1

[&edit - byłeś pierwszy ;)]

A musi być to aplikacja w pełni modularna, czy wystarczyłaby możliwość znacznego rozszerzania możliwości przez pluginy? To wbrew pozorom jest duża różnica :)

Jeśli zadowolisz się pluginami, wystarczy Ci http://www.codeproject.com/KB/macros/Net_AddinProjFrmwork.aspx albo np. http://mef.codeplex.com/ (albo inne, podobne frameworki) - pisanie wszystkiego od zera jest możliwe, ale zajmuje dużo czasu a nie daje więcej możliwości (tak naprawdę to daje mniejsze możliwości, bo żeby osiągnąć poziom frameworka musiałbyś się nieźle namęczyć).

Trudniej będzie jeśli zdecydujesz się na w pełni modularną strukturę.
Można to zrobić tak jak pisze np. @up - implementowanie konkretnego interfejsu przez bibliotekę i uruchamianie go. Z takim podejściem się właśnie spotykałem kilka razy. Cóż, jest to prostsze do napisania ale...
Ma to kilka wad - przede wszystkim jest mało elastyczne (tzn. bardzo elastyczne jak każdy system modularny, ale mniej niż mogłoby być).

Chciałem się jednak pochwalić pomysłem na rozszerzenie tego konceptu który niedawno wyczytałem - ogólnie z pamięci rekonstruuję, ale postaram się w miarę dokładnie opisać:
Biblioteki ładujemy. Każda z nich ma klasę implementującą, powiedzmy, IPluginDescriptor.

interface IPluginDescriptor
{
    string PluginType { get; }
}

(To taki szkielet, wersja robocza dla ukazania konceptu)
I teraz przy wczytywaniu wszystkich bibliotek zapisujemy gdzieś w jakiejś liście wszystkie pluginy razem z ich typami (w tym przypadku string).

Po czym np. główny moduł (okno główne programu) prosi menadżera modułów o wszystkie moduły z typem "MainMenuItem" i dodaje do swojego menu. Tak samo może zrobić np. szukając modułów "ToolbarItem". Pozwala to na praktycznie 100%-towe modyfikowanie aplikacji przez dodawanie modułów (w tym np. podmienienie dotychczasowego modułu na zupełnie inny).
Wiem że pewnie przekombinowane ale chciałem się pochwalić pomysłem bo mi się spodobał ;)

Co do skryptów - nie wiem. Napisanie własnego interpretera to dość niewdziędzne zajęcie - pewnie da się jakoś wykorzystać istniejące .NETowe języki pseudoskryptowe (np. IronPython). Nie wiem jednak jak będzie z umożliwieniem skryptom modyfikowania naszej aplikacji bo po prostu nigdy czegoś takiego nie robiłem...

0

Co do pluginów - może Managed Extensibility Framework, MEF?
http://msdn.microsoft.com/en-us/library/dd460648.aspx

Co do skryptów - jest na pewno możliwość współpracy (i modyfikacji) kodu działającej aplikacji i pisanie skryptów w C# w aplikacji w C# - przez klasę CSharpCodeProvider. I fakt, języki dynamiczne też pewnie dało by się do tego zaprząc (na DLR - IronPython, IronRuby). Oprócz tego jest jeszcze Script.NET: http://www.codeproject.com/KB/cs/ScriptNET.aspx

0

Dzięki wielkie za wskazówki, zapoznam się z w/w materiałami i zobaczę czy uda się coś popełnić.

1 użytkowników online, w tym zalogowanych: 0, gości: 1