Laden...

MEF: Interface und Basisklasse

Erstellt von camelord vor 11 Jahren Letzter Beitrag vor 11 Jahren 1.292 Views
camelord Themenstarter:in
256 Beiträge seit 2006
vor 11 Jahren
MEF: Interface und Basisklasse

Hallo zusammen,

ich würde gerne die MEF Technologie verwenden und habe dafür einen Contract erstellt.
Die zu ladenden Module halten sich mit dem Export Attribut auch schön an den Vertrag und das
MEF System funktioniert einwandfrei.

Jetzt habe ich jedoch einige Funktionen, die ich auf jeden Fall in einer gemeinsamen Basisklasse der Module verabeiten will.

Wie sieht dann die Deklaration der Modulklassen aus? Kann ich das Module von der Basisklasse und von dem Contract Interface ableiten? Wie stelle ich sicher, dass auch alle Funktionen in den Modulklassen implementiert werden?

Mein Ansatz:
Contract


    public interface IModuleContract
    {
        string getMenuDescription();
        int getModuleID();
        void postInitialization(int moduleID);
        void startWork();
    }

Basisklasse


public abstract class ModuleBase : IModuleContract
    {
        public static readonly int MODULE_NOT_INITIALIZED = -1; 
        public int ModuleID { get; set; }

        public ModuleBase()
        {
            ModuleID = MODULE_NOT_INITIALIZED;
        }

        public abstract string getMenuDescription();
        public abstract void startWork();


        public int getModuleID() 
        {
            return ModuleID;
        }

        public void postInitialization(int moduleID)
        {
            if (ModuleID == MODULE_NOT_INITIALIZED)
            {
                ModuleID = moduleID;
            }
        }
    }

Konkretes Modul


    [Export(typeof(Contracts.IModuleContract))]
    public class ModuleTouchdata : Contracts.ModuleBase
    {
        public override string getMenuDescription()
        {
            return "Touchdata Module";
        }

        public override void startWork()
        {
            //do work
        }
    }

Schönen Dank schon mal..

Gruß
Christian

G
47 Beiträge seit 2011
vor 11 Jahren

Hi camelord,

warum machst du keinen Export deiner ModuleBase, wenn du deren Implementation benötigst?


[Export(typeof(Contracts.ModuleBase))]
    public class ModuleTouchdata : Contracts.ModuleBase
    {
        [...]
    } 

Gruß Gwinn

camelord Themenstarter:in
256 Beiträge seit 2006
vor 11 Jahren

Ich dachte, ich muss ein Interface oder deren Eigenschaft/Feld/Methode verwenden um
dann sicherstellen zu können, dass das Modul des Contracts auch die entsprechenden Methoden implementiert.
Aber dennoch will ich (wenn es geht) eine Basisklasse verwenden um keinen doppelten Code zu haben.
Mit dem override Mechanismus des abstrakten Basisklasse ist ja nicht zwingend eine Implementierung im ableitenden Modul.

Gru0
camelord