Laden...

Forenbeiträge von MeisterPetz Ingesamt 2 Beiträge

29.09.2017 - 12:33 Uhr

Vielen Dank für die Antworten! Das Beispiel war wirklich schlecht gewählt und meine Problematik auch schlecht beschrieben, Entschuldigung dafür.
Ok hier die richtige Aufgabenstellung/Problemstellung:
Ich nutze die Baumer GAPI SDK um eine Ansteuerung für eine GeniCam Kamera zu bauen(also Bachelorarbeit). Die SDK hat einige Hauptklassen mit Methoden und Properties zum Beispiel:
System, Interface, Device.
Für jede dieser Klassen habe ich eine Wrapper-Klassen mit dem Inhalt:

Dictionary<string, System> systemRelation{get; private set;} // string =  Id

Diese werden Unity Container verwaltet (so vorgeschrieben).

Für jede gewrappte Klasse wird auch eine "Fassade"-Klasse erstellt:
Diese implementiert alle gebrauchte Funktionalität der originalen Klasse.


    public class GenTlSystem
    {
        private readonly ISystemWrapper systemWrapper;

        public GenTlSystem(ISystemWrapper systemWrapper, string id)
        {
            this.systemWrapper = systemWrapper;
            this.Id = id;
        }

        public string Id { get; private set; }

        public void Close()
        {
                this.systemWrapper.SystemRelation.FirstOrDefault(n =>n.Key.Equals(this.Id)).Value.Close();    
        }

        public void Open()
        {
                this.systemWrapper.SystemRelation.FirstOrDefault(n =>n.Key.Equals(this.Id)).Value.Open();        
        }
         public void SetValue(string node, object newValue)
         {
           this.systemWrapper.SystemRelation.FirstOrDefault(n =>n.Key.Equals(this.Id)).Value. RemoteNodeList[node].value = newValue;
          }

    }

Diese Lösung funktioniert schon so, aber fühlt sich nicht sehr elegant an da Funktionen wie Open und SetValue für jede wieder implementiert werden muss.
Ziel wäre einen WrapperContainer zu erstellen, der alle Wrapper verwaltet und mit nur einer Linq Funktion die jeweiligen Objekte typunabhängig aufruft und die gewünschte Funktion ausführt in Form von:

wrapperContainer.Open( "System", "SystemId" );
wrapperContainer.SetValue("System", "SystemId", "FileName", "C://usw") 

Für das setzen der Werte habe ich ein Strategiemuster was abhängig des Typs umwandelt.

Gibt es eine effizientere und elegantere Lösungen?
Schonmal danke für die Hilfe und ein schönes Wochenende!
Gruß!

28.09.2017 - 10:40 Uhr
    class BuchBox : IBuchBox
    {
        public Dictionary<string, Buch> Buchmenge { get; private set; }
        public BuchBox(Dictionary<string, Buch> buchmenge)
        {
            this.Buchmenge = buchmenge;
        }
    }
    class ZeitschriftenBox
    {
        public Dictionary<string, Buch> Zeitschriftenmenge;
        public ZeitschriftenBox(Dictionary<string, Buch> zeitschriftenmenge)
        {
            this.Zeitschriftenmenge = zeitschriftenmenge;
        }
    }
    class MedienManager
    {
        IBuchBox buchstaender;
        IZeitschriftenBox zeitschriftenstaender;

        private Dictionary<string, object> verbinder;
		
		private Dictionary<string, Type> typenverbinder;

        public MedienManager(IZeitschriftenBox zeitschriftenstaender, IBuchBox buchstaender)
        {
            this.zeitschriftenstaender = zeitschriftenstaender;
            this.buchstaender = buchstaender;
            this.verbinder = new Dictionary<string, object>()
            {
                {"Buch", this.buchstaender },
                {"Zeitschrift", this.zeitschriftenstaender }
            };
			this.typenverbinder = new Dictionary<string, Type>()
			{
				{"Buch", typeof(IBuchBox)},
				{"Zeitschrift", typeof(IZeitschriftenBox)}
			};
        }

        public void SetzeInhalt(string art, string eigenschaft, string wert)
        {
			var medium = Convert.ChangeType(this.verbinder[art], this.typenverbinder[typ]);
			//trotzdem weiter vom Typ object
			medium.oeffnen();
			var seitenAnzahl = medium.GetType().GetProperty("SeitenAnzahl").GetValue(medium); 
			// medium wird als Typ erkannt und die jeweiligen Methoden/Properties sind nutzbar?
        }
    }

Hallo,
ich hoffe mir kann jemand weiterhelfen.
Ich habe oben die Definition einiger Klassen und der Interfaces weggelassen,
da sie sich denke mal aus den Kontex schließen lassen.

Hier die Frage:
Zeitschrift und Buch haben einige unterschiedliche Eigentschaften und
können nicht das selbe Interface nutzen(durch externes SDK nicht möglich).
Ich möchte natürlich nicht alle Funktionen von Buch(extern) in Buchbox
implementieren um sie über mit zu nutzen.

 Dictionary<string, Action<Delegate>> verbinder

Ziel ist dadurch einen Zugriffspunkt zu schaffen und den Zugriff auf das
SDK nicht überall im Code zu verteilen.

Sorry für das schlechte Beispiel 😉 Ich hoffe mir kann jemand weiterhelfen.
Gruß!