2016-03-18 4 views
0

Ich refaktorieren ein Projekt, das mehrere DbCOntexts pro Methodenaufruf in den Datenrepositorys erstellt. Also ich möchte eine Instanz des DbContext pro HTTP-Anfrage haben.Wie verwende ich eine einzelne Instanz von DbContext, pro Anfrage mit Unity

Ich habe versucht zu tun:

container.RegisterType<ApplicationDbContext>(new PerRequestLifetimeManager()); 

und für jedes Repository:

... 
container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext())); 
container.RegisterType<ICountryRepository, CountryRepository>(); 
... 

Aber das wird eine neue Instanz des DbContext() pro Repository, natürlich erstellen.

Ich versuchte

container.RegisterType<IBranchCategoryRepository, BranchCategoryRepository>( 
new InjectionConstructor(container.Resolve<ApplicationDbContext>())); 

Aber das gibt mir:

Die PerRequestLifetimeManager nur im Rahmen einer HTTP-Anforderung verwendet werden können. Mögliche Ursachen für diesen Fehler sind die Verwendung des Lebensdauer- -Managers in einer Nicht-ASP.NET-Anwendung oder die Verwendung in einem Thread, der nicht mit dem entsprechenden Synchronisationskontext verknüpft ist.

Also wie kann ich die gleiche Instanz in jedes Repository injizieren?

Antwort

2

Ich bin nicht vertraut mit Unity, aber ich bin mit verschiedenen anderen IoC-Frameworks.

Warum versuchen Sie festzulegen, was in die Repositories injiziert werden soll?

container.RegisterType<IBusinessRepository, BusinessRepository>(new InjectionConstructor(new ApplicationDbContext())); 

einfach die DbContext hier auslassen, aber es ändern:

container.RegisterType<IBusinessRepository, BusinessRepository>(); 

Da Sie bereits diese Komponente haben registrieren, wird es automatisch in jeder Klasse im Konstruktor injiziert werden, die eine Abhängigkeit haben. Ihre Klasse sollte dann so aussehen:

public class BusinessRepository : IBusinessRepository 
{ 
    private ApplicationDbContext _context; 

    public BusinessRepository(ApplicationDbContext context) 
    { 
     this._context = context 
    } 
} 

Dies funktioniert in Castle Windsor.

+0

Danke, ich nahm das an, aber ich habe eine unbehandelte Ausnahme. Nach dem aktivierten API-Tracing wurde mir klar, was vor sich ging. Es gab andere Klassen mit Abhängigkeiten, die unterbrochen waren. Ich werde deine Antwort akzeptieren, es hat mich aus einer anderen Perspektive betrachtet. –

Verwandte Themen