InterfaceDelegation

    • Release

    Es gibt 1 Antwort in diesem Thema. Der letzte Beitrag () ist von Krischkros.

      InterfaceDelegation

      Hi
      da ich im Moment an einem interface-service-basierten Plug-In-System arbeite, bei dem auch die Sicherheit eine Rolle spielt, habe ich mir ein Programm geschrieben, das Klassen zur Laufzeit erzeugt, die Interfaces implementieren. Dadurch kann man statt der Instanzen der Services die erzeugte Instanz übergeben. Die Aufrufe an das Interface werden an eine "Delegationseinheit" weitergeleitet, die die Aufrufe dann entsprechend verarbeiten kann. Neben der oben genannten Verwendung kann man sie auch z.B. für Remoting über TCP, Pipes, usw. verwenden, indem man die Daten bspw. per Serialisierung an das Ziel überträgt (Für Sicherheit habe ich aber beim bereitgestellten Code nicht gesorgt).

      Name des Programms:
      InterfaceDelegation

      Screenshot:


      Verwendete Programmiersprache und IDE:
      C# (IDE: C# 2010 Express)

      Systemanforderungen:
      .NET Framework 2.0

      Download:
      Sourcecode + Programmbibliothek (Gepackt: 16 Kb, Entpackt ca. 55 Kb)
      Programmbibliothek (Gepackt: 7 Kb, Entpackt: 15 Kb)

      Beispiel
      Beispiel einer sehr einfachen Delegationseinheit, die, außer zum Vorzeigen, sinnlos ist:

      C-Quellcode

      1. using System;
      2. using System.Collections.Generic;
      3. namespace DynamicInterface
      4. {
      5. public class TestDelegationUnit : Delegation.IDelegationUnit
      6. {
      7. private readonly IDictionary<Type, object> _instances;
      8. public TestDelegationUnit(IDictionary<Type, object> instances)
      9. {
      10. _instances = instances; //Stellt die zu type aus Invoke zugehoerigen Instanzen Bereit
      11. }
      12. public object Invoke(Type type, System.Reflection.MethodInfo method, Type[] argumentTypes, object state, object[] parameters)
      13. {
      14. if (method.IsGenericMethodDefinition) //Setzt ggf. generische Parameter bei Methodenaufrufen
      15. method = method.MakeGenericMethod(argumentTypes);
      16. return method.Invoke(_instances[type], parameters); //Ruft die Methode auf den im Dictionary bereitgestellten Instanzen auf
      17. }
      18. }
      19. }

      Verwendung:

      C-Quellcode

      1. using System;
      2. public class ExampleService : IServiceProvider
      3. {
      4. public object GetService(Type serviceType)
      5. {
      6. if (serviceType == typeof(int))
      7. return 123;//gibt fuer den Typ int 123 zurueck
      8. else
      9. throw new ArgumentException("Unsupported service.");
      10. }
      11. }

      C-Quellcode

      1. //Dynamische Assembly automatisch erzeugen lassen
      2. InterfaceDelegateProvider unit = InterfaceDelegateProvider.DefineNew(new System.Reflection.AssemblyName("Test"), false);
      3. IDictionary<Type, object> instances = new Dictionary<Type, object>(); //enthaelt die Service-Provider, die angefordert werden koennen
      4. IServiceProvider delegatedInterface = unit.CreateInstance<IServiceProvider>(new TestDelegationUnit(instances));
      5. instances.Add(typeof(IServiceProvider), new ExampleService()); //Unseren Test-Service-Provider bereitstellen
      6. MessageBox.Show(delegatedInterface.GetService(typeof(int)).ToString()); //Service indirekt aufrufen


      marshalByRef gibt übrigens an, ob die Instanz über Anwendungsdomänen hinweg die gleiche sein soll. Würde man dies nicht tun, müssten die Daten per Serialisierung bereitgestellt werden. Siehe hierzu System.AppDomain und System.MarshalByRefObject.



      Lizenz/Weitergabe:

      Freeware; OpenSource
      Eine namentliche Erwähnung wäre bei einer Verwendung nett.

      Das kann vmtl. nicht unbedingt jeder brauchen, aber den ein oder anderen könnte auch der Quellcode interessieren. Viel Spaß ;).

      Gruß
      ~blaze~

      Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „~blaze~“ ()