2016-08-02 14 views
-3

Ich habe abstrakte Klasse BaseClass mit MyClassA und MyClassB Implementierungen. Der Benutzer kann diese zwei Unterklassen erweitern oder sie verwenden, z. Er erstellt nur UserExtensionClassA und verwendet MyClassB wie es ist. Für die Initialisierung der Klassen ist eine Klasse ClassC zuständig. Er empfängt eine Konfiguration (die z. B. die vollständigen Klassennamen der benötigten Implementierungsklassen enthält) und entscheidet, wann und ob die Klassen initialisiert werden (z. B. bereits 3 existierende Instanzen von BaseClass Implementierungen => Erstellungsanforderung ablehnen).Wie vermeide ich Reflektionen?

Frage: Wie kann ich die Reflexion im Beispiel vermeiden? ClassC kann die Klassen aus den Namen in der Konfiguration erstellen. Aber ich kann immer noch fast alles in der Bibliotheksimplementierung ändern und ich mag Reflektionsmaterial nicht.

+3

Dies ist verwirrend, bitte poste etwas Code, um die Situation zu klären. auch scheint reflexion nicht so schlecht eine lösung ... – slawekwin

+0

Bitte posten was du probiert hast? Hilft viel. –

+0

Warum nicht den Code schreiben anstatt zu schreiben * "Ich habe abstrakte Klasse BaseClass mit MyClassA und MyClassB Implementierungen" *? Es ist nicht klar, warum und wie Sie Reflexion verwenden (Konfiguration ist Wörterbuch?), Können Sie es zeigen? Sowie gewünscht * Pseudo-Code *. Aber in allgemeinen Gründen wie * "Ich mag keine Reflektion Sachen" * sind nicht vernünftig. Liest du die Konfiguration einmal oder 1234567 mal? Haben Sie ein Problem mit der Leistung/dem Speicher? – Sinatr

Antwort

2

Ich würde empfehlen, keine eigenen zu verwenden, sondern auf einen vorhandenen IoC (Inversion of Control) -Container wie Autofac zu setzen, da dies Ihnen ein hohes Maß an Flexibilität bietet und gleichzeitig Designkonzepte wie Dependency Injection (DI) und Inversion erleichtert Kontrolle (IOC)

meisten IoC Behälter stellen eine programmatische Schnittstelle sowie JSON/XML-Datei-basierte Konfigurationsunterstützung einschließlich Autofac:

Autofac Configakte Beispiel:

{ 
    "defaultAssembly": "Autofac.Example.Calculator", 
    "components": [ 
     { 
      "type": "Autofac.Example.Calculator.Addition.Add, Autofac.Example.Calculator.Addition", 
      "services": [ 
       { 
        "type": "Autofac.Example.Calculator.Api.IOperation" 
       } 
      ], 
      "injectProperties": true 
     }, 
     { 
      "type": "Autofac.Example.Calculator.Division.Divide, Autofac.Example.Calculator.Division", 
      "services": [ 
       { 
        "type": "Autofac.Example.Calculator.Api.IOperation" 
       } 
      ], 
      "parameters": { 
       "places": 4 
      } 
     } 
    ] 
} 

Erstellen des Containers:

// Add the configuration to the ConfigurationBuilder. 
var config = new ConfigurationBuilder(); 
config.AddJsonFile("autofac.json"); 

// Register the ConfigurationModule with Autofac. 
var module = new ConfigurationModule(config.Build()); 
var builder = new ContainerBuilder(); 
builder.RegisterModule(module);