0

Ich kann keine Dokumentation zur Verwendung von Autofac zusammen mit Lazy und Lifetime-Scopes finden. eine Fehlermeldung überLifetime Bereiche mit Lazy Initialization?

bekommen "Kein Rahmen mit einem Tag Matching 'Transaktion' sichtbar aus dem Anwendungsbereich in der die Instanz angefordert wurde ..."

In meinem Controller-Konstruktor:

public HomeController(Lazy<ISalesAgentRepository> salesAgentRepository, Lazy<ICheckpointValueRepository> checkpointValueRepository) 
{ 

     _salesAgentRepository = new Lazy<ISalesAgentRepository>(() => DependencyResolver.Current.GetService<ISalesAgentRepository>()); 
     _checkpointValueRepository = new Lazy<ICheckpointValueRepository>(() => DependencyResolver.Current.GetService<ICheckpointValueRepository>()); 
} 

In meiner Aktion:

using (var transactionScope = AutofacDependencyResolver.Current.ApplicationContainer.BeginLifetimeScope("transaction")) 
{ 
    using (var repositoryScope = transactionScope.BeginLifetimeScope()) 
    { 
     // .... 
    } 
} 

Sind Lebensbereiche mit Lazy inkompatibel oder habe ich es komplett falsch verstanden?

Antwort

5

Ja, Sie bellen den falschen Baum auf.

Für jede neue Anwendungsanfrage wird ein neuer Controller erstellt. Daher muss nicht versucht werden, die Lebensdauer der Abhängigkeiten getrennt zu verwalten.

Konfigurieren Sie Ihre Repositorys so, dass sie eine Gültigkeitsdauer haben. Machen Sie dasselbe für den Transaktionsbereich.

Wenn beide Repositories fertig sind, haben sie dasselbe gemeinsame transactionScope.

Sie können auch die Transaktion zu einem Aktionsfilter begehen bewegen, wie folgt aus:

public class TransactionalAttribute : ActionFilterAttribute 
{ 
    private IUnitOfWork _unitOfWork; 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     if (filterContext.Controller.ViewData.ModelState.IsValid && filterContext.HttpContext.Error == null) 
      _unitOfWork = DependencyResolver.Current.GetService<IUnitOfWork>(); 

     base.OnActionExecuting(filterContext); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     if (filterContext.Controller.ViewData.ModelState.IsValid && filterContext.HttpContext.Error == null && _unitOfWork != null) 
      _unitOfWork.SaveChanges(); 

     base.OnActionExecuted(filterContext); 
    } 
} 

(IUnitOfWork mit Transaction ersetzen). Quelle: http://blog.gauffin.org/2012/06/05/how-to-handle-transactions-in-asp-net-mvc3/

+1

Wenn es Web-API-Filter ist. Löse es aus dem Kontext. 'filterContext.Request.GetDependencyScope(). GetService (typeof (IUnitOfWork)) als IUnitOfWork'. Andernfalls wird es vom Root-Container aufgelöst und es wird nicht dieselbe Instanz in der Anfrage sein. Weil Web-API filtert Art von Singleton. –