Ich erstelle eine kleine C# -Anwendung, die derzeit aus einer Kernbaugruppe und einer Winforms-Baugruppe besteht. Mir ist klar, dass ich Ninject in einer kleinen Sache wahrscheinlich nicht wirklich brauche, aber ich würde es gerne ausprobieren.C#, Ninject: Wo setzt du den Kernel und deine Module?
Egal, um mit Ninject zu arbeiten Ich habe verstanden, dass Sie eine Reihe von Modulen schreiben würde, welche Karten Klasse zurückgegeben wird und so weiter. Danach erstellen Sie eine Instanz von IKernel
und laden Sie Ihre Module in diese.
Aber wo behalte ich diese Module? Und wo behalte ich den Kernel? Wohin geht das Zeug?
Ich war nur auf der Suche nach einem kanonischen Weg, dies zu tun und dachte "großartig!" Als ich dich sah, verknüpfte ich einen. Schlechte Nachrichten, dieser Code ist TERRIFICally UNTHREADSAFE. Wenn ich den Kernel in einen Singleton verpacken soll, kann ich das selbst auf sichere Weise tun (Hinweis, statischer Konstruktor), aber sei gewarnt, alle, die in Zukunft hierher kommen: Dieser Link-Artikel ist eine komplett nicht threadsichere Implementierung. –
@JimmyHoffa Ich stimme zu, dass es nicht threadsafe ist (schlagen Sie vor, einen Ansatz Ihrer Wahl von http://csharpindepth.com/articles/general/singleton.aspx anzuwenden). Aber viel besser als das ist es, mit dem Hauptpunkt meiner Antwort zu gehen, nämlich eine Kompositionswurzel zu haben, die einen klaren Platz hat, wo die Initialisierung stattfinden kann, um die Notwendigkeit für diese Threadsicherheit (neben anderen Problemen) aus dem Bild zu nehmen vollständig. –
Ich bin nicht vertraut mit Ihrer Komposition root, aber ohne Zugriff auf den Kernel, wie fordern Sie Objekte, denen der Konstruktor injiziert werden soll? in Ihrer UI möchten Sie Zugriff auf Ihren 'UserManager', der ein' IUserRepository' bei der Erstellung benötigt; Wie bekommst du diesen 'UserManager' ohne Zugriff auf den Kernel (durch so etwas wie einen Service-Locator)? Sie können nicht einfach 'new UserManager (???);' und erwarten, dass das Richtige an den Konstruktor übergeben wird, oder? –