2009-08-07 20 views
2

Wie verbinde ich meine Schnittstelle mit einer konkreten Klasse in einer anderen Baugruppe?Ninject-Bindung

Ich habe folgende Projekte in meiner Lösung:

Foo.Data
Foo.Domain

In Struktur Plan Ich meine zwei Montagenamen in die StructureMap.config Datei hinzufügen und dann mit dem PluginFamily und Pluggable-Attribute ordnen meine Schnittstellen meiner konkreten Klasse zu.

Wie kann dasselbe mit Ninject erreicht werden?

+0

Enthalten die Projekte in der Projektmappe sowohl die Schnittstellen als auch die konkreten Klassen? Möchten Sie diese in einer konsumierenden Lösung/Projekt oder in dieser Lösung selbst binden? –

+0

Welche Version von Ninject benutzt du auch? –

+0

@Peter Die Schnittstelle ist in meiner Domäne und die konkreten Klassen in der Datenschicht. Ich versuche nur, innerhalb der Lösung zu binden. Ich erwäge auch, anstatt die Domäne und Datenschicht nach Projekt zu trennen, um es in separaten Ordnern innerhalb desselben Projekts zu tun. Ich verwende Ninject 1.0 für das kompakte Framework. –

Antwort

6

Ich werde hier ein paar Annahmen machen.

  1. Sie haben eine Schnittstelle namens IBar in Ihrem Foo.Domain-Projekt und Sie haben eine konkrete Klasse namens BarClass in Ihrem Foo.Data-Projekt.
  2. Sie verweisen tatsächlich auf Foo.Domain-Projekt in Ihrem Foo.Data-Projekt, da BarClass IBar implementiert.

Die einfachste Sache mit Ninject zu tun ist, um eine neue Klasse in Foo.Data zu erstellen, die von Ninject der Standardmodule ergibt sich:

internal class BarModule : StandardModule { 
    public override void Load() { 
    Bind<IBar>() 
     .To<BarClass>(); 
    } 
} 

Diese Klasse dann die Bindung für Anfragen von IBar an die konkrete Klasse etabliert von BarClass. Dies ist Ihr XML-Äquivalent.

Der nächste Schritt besteht darin, den Ninject-Kernel (auch bekannt als "Container") zu erstellen und dieses Modul (d. H. Diese Konfiguration) ihm zur Verfügung zu stellen. Wo Sie dies tun, hängt stark davon ab, welche Art von Anwendung Sie erstellen. Ganz allgemein konfigurieren Sie den Kernel normalerweise am logischen Einstiegspunkt oder "Start" -Bereich Ihres Codes. Wenn es sich um eine Konsole oder eine Windows-Desktop-Anwendung handelt, ist dies wahrscheinlich eines der ersten Dinge, das die Funktion main() ausführt.

würde der Code dies mag:

var modules = new IModule[] { 
           new BarModule() 
          }; 

var kernel = new StandardKernel(modules); 

An diesem Punkt, wenn Sie so etwas tun:

var barObj = kernel.Get<IBar>() 

Die Variable barObj verweist auf eine Instanz von BarClass.

Alles gesagt, ich könnte sehr gut nicht alle Nuancen Ihrer Anwendung verstehen - z. Assemblys werden dynamisch geladen, etc. Hoffe, das ist irgendwie hilfreich.

+0

Ein bisschen spät auf die Party, aber das ist eine sehr solide Antwort, danke Peter. –