2013-11-27 5 views
17

ich die folgende Klasse haben:Schloss Windsor Register-Klasse mit Konstruktorparameter

public class DatabaseFactory<C> : Disposable, IDatabaseFactory<C> where C : DbContext, BaseContext, new() 
{ 
    private C dataContext; 
    private string connectionString; 

    public DatabaseFactory(string connectionString) 
    { 
     this.connectionString = connectionString; 
    } 

    public C Get() 
    { 
     return dataContext ?? (dataContext = Activator.CreateInstance(typeof(C), new object[] {connectionString}) as C); 
    } 

    protected override void DisposeCore() 
    { 
     if (dataContext != null) 
      dataContext.Dispose(); 
    } 
} 

Wenn ich versuche, die Web-api zu starten, erhalte ich folgende Fehlermeldung:

Can't create component 'MyApp.DAL.Implementations.DatabaseFactory'1' as it has dependencies to be satisfied. 'MyApp.DAL.Implementations.DatabaseFactory'1' is waiting for the following dependencies: - Parameter 'connectionString' which was not provided. Did you forget to set the dependency?

Wie kann ich richtig registrieren und wie gebe ich den Parameter zur Laufzeit weiter?

Antwort

28

Sie müssen den Konstruktor Parameter registrieren:

container.Register(
    Component.For<IDatabaseFactory>().ImplementedBy<DatabaseFactory>() 
      .DependsOn(Dependency.OnValue("connectionString", connectionString)) 
    ); 
+2

Connection ist ein Variable. Wie wird es an die dependencyinstaller-Klasse übergeben? –

+0

@ Ivan-MarkDebono Kannst du es nicht aus einer Konfigurationsdatei lesen? Müssen Sie mehrere Verbindungszeichenfolgen haben? –

+0

Die Verbindungszeichenfolgen werden aus einer separaten Datenbank abgerufen, und der Benutzer wählt eine davon beim Anmelden aus. Das EF-Modell ist immer dasselbe, dem Benutzer stehen jedoch verschiedene Datenbanken zur Auswahl. –

6

Sie Abhängigkeiten von Resolve() Methode Name durch Hinzufügen eines anonymen Typs mit Konstruktorparameter einstellen

Beispiel:

IDatabaseFactory factory = container.Resolve<IDatabaseFactory>(new { connectionString = connectionString }); 
Verwandte Themen