Dependency-Injektion (ninject) mit Strings, Anti-Pattern?

8

Ich habe Code, der Ninject verwendet, um Abhängigkeiten zu injizieren, diese Abhängigkeiten sind tatsächliche Zeichenfolgen. Ist dies ein Anti-Pattern zum Einfügen von Strings, anstatt zum Beispiel ein neues Objekt zu erstellen.

i.e. Ich wollte Benutzername und Passwort injizieren, wäre es tatsächlich besser, eine kleine Klasse namens credentials mit 2 Eigenschaften von Usernamd und Password zu erstellen und diese zu injizieren?

Das Einfügen von Strings in Konstruktoren kann über

erfolgen %Vor%

Riecht dieser Code?

Irgendwelche Ideen oder Verbesserungen was ich mache?

    
Martin 11.09.2013, 10:15
quelle

5 Antworten

5

Ich würde hier ToMethod() bevorzugen:

%Vor%

Wenn der User -Konstruktor andere Abhängigkeiten hat, würde ich auf @ jgauffin's Antwort verzichten.

Sie könnten weiterhin ToMethod() mit Kernel :

verwenden %Vor%     
Ed Chapel 11.09.2013, 11:11
quelle
2
  

Riecht dieser Code?

Ja. Erstellen Sie entweder einen ConfigurationRepository oder erstellen Sie einen Factory / Builder (zwei verschiedene Designmuster), der die verschiedenen Services erstellt und dann diesen Factory / Builder im Container registriert.

Ich habe auch ein Problem mit diesem Code:

%Vor%

Ein IoC-Container wird in erster Linie nicht zum Erstellen von Domänenentitäten verwendet, sondern zum Erstellen von Diensten / Repositories / Controllern usw., d. h. zum Erstellen der Objekte, die den Fluss in Ihrer Anwendung steuern.

    
jgauffin 11.09.2013 10:28
quelle
0

Ich bemühe mich sehr, primitive Typen zu vermeiden.

Wenn ich auf den von Ihnen geposteten Code schaue, wäre mein erster Instinkt, einen "IConfigurationService" zu erstellen und diesen nach Bedarf zu injizieren. Dieser Dienst enthält Eigenschaften für Benutzername und Kennwort.

    
vidalsasoon 11.09.2013 18:30
quelle
0

Es scheint hier zwei Fragen zu geben:

  1. Ist es ein Code-Geruch / Anti-Muster, um Primitive zu injizieren?
  2. Soll eine Art von Typ erstellt werden, um Benutzernamen und Passwort-Strings zu erstellen?

Das sind völlig verschiedene Probleme. Erstens ist eine Abhängigkeit eine Abhängigkeit. Es kann komplex oder primitiv sein, aber die Verwaltung von Abhängigkeiten sollte konsistent sein. Wenn Sie einen IoC-Container verwenden, ist es absolut kein Code-Geruch, um Primitive zu injizieren. IoC Container und Composition Root sind privilegierte Teile des Codes, die die Anforderungen aller Services verstehen und sie erfüllen. Konzeptionell gilt dies für komplexe und primitive Typen. In der Praxis gibt es jedoch unterschiedliche Mechanismen zum Registrieren komplexer Abhängigkeiten von elementaren Abhängigkeiten. Der von Ihnen aufgelistete Argumentname ist vollständig gültig. Andere Ansätze hängen vom Argument-Index ab. Wenn Sie zwischen den beiden Optionen wählen, werden die Haare gespalten, aber es kommt darauf an, ob Sie die Konstruktorargumente umbenennen oder Konstruktorargumente neu ordnen können, ohne den Verdrahtungscode zu ändern.

Die Alternative besteht darin, konkrete Abhängigkeiten zu haben (oder, schlimmer noch, das Service-Locator-Muster), das ein rutschiger Abhang zu einem nicht entzifferbaren Schlammball ist.

Zweitens hängt es davon ab, wie oft diese Werte zusammen verwendet werden und wie DRY Sie sein wollen. Irgendwann gibt es abnehmende Renditen, um DRYness zu verfolgen. Wenn die Werte immer zusammen injiziert werden, können Sie die Ninject-Konfigurationsaufrufe einfach umstrukturieren. Was auch immer Sie wählen, stellen Sie sicher, dass die Logik in der Codebasis konsistent ist.

Der letzte Punkt, bei dem IoC-Container zum Verwalten von Entitäten verwendet werden, wird als Code-Geruch betrachtet. Entitäten sind in der Regel dafür verantwortlich, Domäneninvarianten während der Ausführung von Domänenaktionen zu verwalten. (Nicht sicher, was der Kontext / die Absicht des Beispielcode-Snippets ist, kann also keine Alternative bieten.)

    
G-Wiz 28.08.2014 18:10
quelle
-1

Stellen Sie sich eine Assembly vor, die alle Ihre Schnittstellen für die Injektion bereithält. In meiner aktuellen Arbeitslösung (Prisma, mit MEF) habe ich eine Klasse, die konstante Zeichenfolgen für die von Ihnen angegebene Verwendung deklariert.

Warum würden Sie Konstanten über Literale verwenden? Weil es ein Symbol ist; es ist refactorable, erkennbar und der tatsächliche Inhalt der Zeichenfolge ist egal. Ich verwende immer eine GUID als Suffix für meine Strings, damit ich die Einzigartigkeit garantieren kann. Eine Konstante ist auch für Attributdekorationen verfügbar.

%Vor%

Beachten Sie den Schreibfehler in TOOL_DIAGRAM_REGION . Es ist egal, dass ich es vermasselt habe, denn kein Entwickler sollte es jemals wieder eingeben müssen. Ich habe diesen Fehler nur bemerkt, weil ich die Strings gescannt habe und sie hier eingefügt habe.

    
Gusdor 11.09.2013 10:20
quelle