Avatar billede munkeholm Nybegynder
26. september 2012 - 10:25 Der er 11 kommentarer

Container-returtype i et interface, plugin-struktur

Hej, Jeg sidder med et projekt, med en plugin-struktur.

Jeg har et interface, PluginInterface indeholdende en metode som gerne skulle have en returtype af en form for container; List, Array, ArrayList e.l. .

ex: Array<String> getArray(); eller ArrayList getArrayList(); 

En DLL implementerer dette interface og anvender dens metode.

Endelig indlæser en Form DLL'en og implementerer samme interface.

*****

Men når jeg medtager metoden med en container som returtype i interfacet får jeg denne fejl; ReflectionTypeLoadException was unhandled.

Ved denne del af koden:

      Type [] pluginTypes = Assembly.LoadFile(s).GetTypes();

*****

Hvordan kan jeg anvende metoder med en container som returtype fra interfacet?
Avatar billede arne_v Ekspert
26. september 2012 - 14:08 #1
Har du taenkt dig selv at tage point i dette spoergsmaal ligesom i http://www.eksperten.dk/spm/969173 ?
Avatar billede janus_007 Nybegynder
26. september 2012 - 19:21 #2
Ja det vil jeg også gerne vide.
Avatar billede munkeholm Nybegynder
27. september 2012 - 17:07 #3
Det er IKKE som det skal være, det kan jeg godt se. Pointene burde i øvrigt have været splittet imellem svarene.
Avatar billede munkeholm Nybegynder
27. september 2012 - 17:30 #4
Jeg kender ikke MEF, og ved ikke hvor meget arbejde det vil kræve at  omstrukturere projektet til dette.

Hvordan kan jeg anvende metoder med en container som returtype fra interfacet?


Problemet er linjen med: "pluginTypes = asb.GetTypes();"

namespace TestBuilder
{
    public partial class Form1 : Form
    {...

  public void loadPlugins()
        {
String exePath = Assembly.GetExecutingAssembly().GetModules()[0]. FullyQualifiedName;
String pluginDir = Path.GetDirectoryName(exePath) + "\\Plugin";
    foreach (String s in Directory.GetFiles(pluginDir, "*.dll"))
            {             
          Assembly asb = Assembly.LoadFile(s);
          pluginTypes = asb.GetTypes(); // kaster exception
                }           
                foreach(Type t in pluginTypes)
                {                   
        iPlugin plugin = Activator.CreateInstance(t) as iPlugin; 
//Hent Container // String [] DLLContent = plugin.getContainer();                 
                  break;
                }}}}
Avatar billede janus_007 Nybegynder
27. september 2012 - 20:52 #5
Du skal stadig bruge dependency injection, det er spild af tid at sidde manuelt at loade assemblies på den måde.
Avatar billede arne_v Ekspert
28. september 2012 - 20:45 #6
Med MEF skal du:

1)

Lade alle dine plugin klasser implementere et interface og eksportere dette:

[Export(typeof(IFoobar))]
public class Something : IFoobar
{
    // implementation af metoder i interface
}

2)

Lave en klasse som skal have en ref til alle plugins:

public class PluginManager
{
    [ImportMany]
    private List<IFoobar> plugins = null;
    ...
    // metoder som bruger plugins
    ...
}

3)

Loade alle plugins af type IFoobar fra et eller flere directories:

PluginManager pm = new PluginManager();
AggregateCatalog cat = new AggregateCatalog();
cat.Catalogs.Add(new DirectoryCatalog(@"C:\Foobar"));
CompositionContainer container = new CompositionContainer(cat);
container.SatisfyImportsOnce(pm);
// pm er klar til brug
Avatar billede arne_v Ekspert
28. september 2012 - 20:46 #7
MEF giver ingen restriktioner paa retur type.

Men det boer manuel kode nu heller ikke goere.
Avatar billede arne_v Ekspert
28. september 2012 - 20:47 #8
-> Janus

MEF er faktisk en form for DI.

Men hvor traditionel DI loader et bestemt antal plugins, saa er MEF designet til ogsaa at kunne scanne DLL's i flere dirs og loade alle dem som matcher.
Avatar billede janus_007 Nybegynder
29. september 2012 - 08:46 #9
Hej Arne

Det kan Structuremap :)

scanner.AssembliesFromPath("some path");
                                            scanner.AddAllTypesOf<SomeType>();


Kender dog ikke til MEF, men vil straks læse lidt op på det :)
Avatar billede janus_007 Nybegynder
29. september 2012 - 09:07 #10
Tror jeg bedre forstår MEF nu, scanning af dirs kan både Structuremap og Ninject gøre, men dog ikke Spring.NET

Anyway, kan denne forherligelse af MEF have noget at gøre med at projektet er startet af MS-folk som er mest "vant" til at bruge Unity som ikke understøtter dir-scanning?
Avatar billede arne_v Ekspert
29. september 2012 - 20:44 #11
Grundliggende er formaalet med DI og plugins forskellige.

Fremkomsten af MEF i .NET 4.0 skal nok snarere ses som et resultat af kritik af MAF som kom i .NET 3.5.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester