[C# / MEF] disable/enable plugins

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Ik ben samen met een vriend aan een project aan het werken welke gebruik maakt van MEF voor plugin support. Het programma heeft momenteel 3 plugin types welke allemaal minimaal van IPlugin inheriten:

C#:
1
2
3
4
5
public interface IPlugin
{
    Guid Guid { get; }
    PluginInfo PluginInfo { get; }
}


De plugins worden in 3 arrays geïmporteerd in een plugin manager class (1 array per plugin type). Alles werkt prima, maar de gebruiker moet de mogelijk hebben om plugins te disablen. Nu weet ik niet hoe ik dit het best kan aanpakken. Heeft MEF iets die dit mogelijk maakt? Zo niet, is het een goed idee om een "Enabled" property toe te voegen aan aan IPlugin (plugins slaan momenteel niets van settings op)? Of iets anders?

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • pedorus
  • Registratie: Januari 2008
  • Niet online
Bedoel je nu iets als How to remove MEF plugins at runtime ? Er is een reden dat Firefox moet herstarten als je een plugin disabled.

Verder zou ik de settings door de hoofdapplicatie laten beheren (plugins zijn natuurlijk niet te vertrouwen ;)).

Vitamine D tekorten in Nederland | Dodelijk coronaforum gesloten


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Nee, plugins hoeven niet verwijdert te worden, enkel disabled of enabled. Waar ik niet uit geraak is waar ik het best de "Enabled" property plaats. In IPlugin lijkt me niet aangeraden (?) sinds plugins kunnen doen wat ze willen met de getter en setter (bv Enabled { get { return true; } set; } i.p.v gewoon Enabled { get; set; }). We maken ook gebruik van SQLite. Misschien is het het best om daar een tabel toe te voegen met PluginGuid en Enabled velden?

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD


Acties:
  • 0 Henk 'm!

  • Asator
  • Registratie: December 2009
  • Laatst online: 12-02-2024
Je geeft zelf al aan al aan een plugin manager class te hebben. Het lijkt mij dat het aan en uit zetten van plugins hoort bij de verantwoordelijkheid van deze klasse, en niet bij de plugins zelf zoals pedorus al aangeeft. Verder weet ik niet veel van MEF maar het lijkt me prima om in status bij te houden in SQLite.

Acties:
  • 0 Henk 'm!

  • R4gnax
  • Registratie: Maart 2009
  • Laatst online: 06-09 17:51
Hyperz schreef op woensdag 14 december 2011 @ 17:59:
Nee, plugins hoeven niet verwijdert te worden, enkel disabled of enabled. Waar ik niet uit geraak is waar ik het best de "Enabled" property plaats. In IPlugin lijkt me niet aangeraden (?) sinds plugins kunnen doen wat ze willen met de getter en setter (bv Enabled { get { return true; } set; } i.p.v gewoon Enabled { get; set; }). We maken ook gebruik van SQLite. Misschien is het het best om daar een tabel toe te voegen met PluginGuid en Enabled velden?
Als je je om vijandige plugins druk maakt die zichzelf niet correct uit willen schakelen, dan heb je een groter probleem. Vergeet niet dat MEF composable parts allemaal binnen hetzelfde AppDomain draaien met allemaal dezelfde rechten en dus aardig wat binnen je programma kunnen rommelen als er zelfs maar een beetje reflection gebruikt kan worden. Je moet er dus vanuit kunnen gaan dat plugins met MEF zich gewoon netjes gaan gedragen.

Hier is hoe ik het op zou lossen:
  1. Maak je plugins altijd disposable. D.w.z. IPlugin moet van IDisposable afstammen.
  2. Haal de GUID uit je plugin interface en maak hier (strongly-typed) export metadata van.
  3. Optioneel: maak een custom export attribuut (bijv. ExportPluginAttribute) wat altijd deze metadata vereist. Dit maakt het moeilijker om deze metadata per ongeluk te vergeten mee te geven.
  4. Schrijf een ExportProvider die een bestaande ExportProvider implementatie decoreert. Deze moet als filter dienen en enkel de ExportDefinition instanties terug geven waarvan de GUID (uit de export metadata!) in een aangeleverde collectie ingeschakelde plugin GUIDs voorkomt.
  5. Gebruik deze filter ExportProvider als invoer voor je CompositionContainer.
Zodra je plugins aan/uit zet kun je de build-up van je composition container opnieuw doorlopen (misschien dat de term recomposition je al bekend is) en MEF zou netjes plugins die uitgezet zijn moeten gaan disposen. Verder hoeven uitgezette plugins nooit geinstantieerd te worden om te kijken of hun GUID enabled is, want de nodige informatie zit al in de export metadata.

Assembly DLLs die plugins bevatten blijven hiermee wel gelocked totdat de applicatie afgesloten wordt. Daar is eventueel nog omheen te werken door tijdens de applicatie start shadow copies te maken en MEF enkel op de copies te laten werken.

[ Voor 8% gewijzigd door R4gnax op 14-12-2011 20:33 ]


Acties:
  • 0 Henk 'm!

  • Hyperz
  • Registratie: Augustus 2009
  • Laatst online: 09-07 02:45
Bedank voor de info R4gnax :). Lijkt me idd een mooie oplossing, en recomposition is al enabled op de imports.

Asus P8P67 EVO | i5 2500k (4.8 GHz) | Sapphire HD 7970 Vapor-X GHz Ed. | 8 GB DDR3 1600 | 1 TB HDD

Pagina: 1