3 Stimmen

Verwirrt bei Dependency Injection

Ich bin neu in MVC und Dependency Injection. Bitte helfen Sie mir zu verstehen, wie das funktionieren sollte. Ich verwende Ninject. Hier ist mein Code:

in der Datei Global.asax:

private void RegisterDependencyResolver()
    {
        var kernel = new StandardKernel();
        kernel.Bind<IDbAccessLayer>().To<DAL>(); 
        // DAL - is a Data Access Layer that comes from separated class library 
        DependencyResolver.SetResolver(new NinjectDependencyResolver(kernel));
    }

protected void Application_Start()
    {
        RegisterDependencyResolver();
    }

Die Implementierung von IDbAccessLayer ist sehr einfach:

public interface IDbAccessLayer
{
  DataContext Data { get; }
  IEnumerable<User> GetUsers();
}

jetzt in einem Controller muss ich einen Konstruktor erstellen, der IDbAccessLayer-Parameter erhält. Und das funktioniert einfach.

Jetzt weiß ich nicht, wie man eine Verbindungszeichenfolge an DAL übergeben. Wenn ich versuche, DAL-Konstruktor mit etwas, das einen Parameter akzeptiert zu ersetzen, funktioniert es nicht. Es wird eine Ausnahme mit folgender Meldung geworfen Kein parameterloser Konstruktor für dieses Objekt definiert

5voto

Darin Dimitrov Punkte 990883

Sie können Konstruktorparameter angeben:

kernel
    .Bind<IDbAccessLayer>()
    .To<DAL>()
    .WithConstructorArgument("connectionString", "YOUR CONNECTION STRING HERE");

Und anstatt die Verbindungszeichenfolge in Ihrem System fest zu kodieren Global.asax können Sie sie aus Ihrer web.config auslesen:

ConfigurationManager.ConnectionStrings["CNName"].ConnectionString

und jetzt kann Ihre DAL-Klasse die Verbindungszeichenfolge als Parameter übernehmen:

public class DAL: IDbAccessLayer
{
    private readonly string _connectionString;
    public DAL(string connectionString) 
    {
        _connectionString = connectionString;
    } 

    ... implementation of the IDbAccessLayer methods
}

1voto

mellamokb Punkte 55046

Erstellen Sie einen parameterlosen Konstruktor, der den Ein-Parameter-Konstruktor mit einer Standardverbindungszeichenfolge aufruft.

public DAL() : this("default connection string") {

}

public DAL(string connectionString) {
    // do something with connection string
}

0voto

Brent Arias Punkte 27509

Ich habe nicht mit ninject gearbeitet, nur ein bisschen mit Unity. Aber alle IOC-Container scheinen darauf abzuzielen, dass Sie Ihre eigene Fabrikklasse erstellen, die Ihre zustandsabhängigen Parameter (Ihre Verbindungszeichenfolge) übernimmt und Ihr echtes Objekt zurückgibt. Wenn Sie beispielsweise eine Personenklasse haben, die einen "Namen" und ein "Alter" für den Konstruktor benötigt, dann müssen Sie eine Fabrikklasse erstellen, die mit Unity in etwa so interagieren würde:

IPerson foo = container.Resolve<IPersonFactory>().Create("George", 25);

Das ist eines der Dinge, die ich an IOC-Containern nicht mag, aber so läuft es im Allgemeinen...

0voto

driushkin Punkte 3421

Einfach eine dumme Idee, wenn man keine Ahnung von ninject hat:

kernel.Bind<IMyConnectionString>().To<MyConnectionString>();

Und zu Ihrem DAL-Konstruktor, der IMyConnectionString akzeptiert

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X