2013-11-27 31 views
17

Mam następujące klasy:Zamek Windsor klasa rejestr z konstruktorem parametry

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(); 
    } 
} 

Kiedy próbuję uruchomić api internetowej, pojawia się następujący błąd:

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?

jak mogę zarejestrować go poprawnie i jak przekazać parametr w czasie wykonywania?

Odpowiedz

28

Musisz zarejestrować parametr konstruktora:

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

connectionString jest zmienna. Jak jest przekazywana do klasy dependencyer? –

+0

@ Ivan-MarkDebono Nie możesz przeczytać tego z pliku konfiguracyjnego? Czy potrzebujesz wielu ciągów połączeń? –

+0

Ciągi połączeń są pobierane z oddzielnej bazy danych, a użytkownik wybiera jedną z nich podczas logowania. Model EF jest zawsze taki sam, ale użytkownik może wybierać spośród wielu różnych baz danych. –

6

Można ustawić współzależności na Resolve() metody dodając typ anonimowy z nazwą konstruktora parametru

Przykład:

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