2017-04-20 3 views
0

Ich benutze Delegate Factories, um ein Objekt mithilfe einer statischen .Create() - Funktion zu erstellen, da die Erstellung des Objekts etwas schwer ist und nicht gehört in einem Konstruktor. Dieses Objekt (UserToken) wird auf jedem Mvc Controller verwendet.Warum AutoFac Delegate Factories registriert InstancePerRequest wird jedes Mal aufgerufen, wenn ein Typ injiziert wird

Ich habe bemerkt, in meinem Codebeispiel, bei der Registrierung mit einer AutoFac-Delegiertenfunktion zum Erstellen von UserToken die UserToken.Create() wird mehrmals pro Anfrage aufgerufen. Ich habe erwartet, dass es nur einmal pro Anfrage aufgerufen wird und die resultierenden UserToken vom Builder gespeichert und wiederverwendet werden. Was fehlt mir hier? Ich möchte nur UserToken.Create einmal pro Anfrage aufgerufen.

builder.Register<Func<HttpContextBase, IUnitOfWork, UserAccountToken>>(
    c => { 
      var db = c.Resolve<IUnitOfWork>(); 
      var hc = c.Resolve<HttpContextBase>(); 

      return (context, database) => { return UserAccountToken.Create(hc, db); }; 
     }).InstancePerRequest(); 

builder.Register<UserAccountToken>(
    c => { 
      var db = c.Resolve<IUnitOfWork>(); 
      var hc = c.Resolve<HttpContextBase>(); 

      return UserAccountToken.Create(hc, db); 

     }).As<IUserAccountToken>().InstancePerRequest(); 

Antwort

0

Ich bin mir nicht sicher, wie Sie den registrierten Typ Func<HttpContextBase, IUnitOfWork, UserAccountToken> verwenden. Sie geben im Grunde eine Funktion zurück, die zwei Parameter empfängt, die Sie nie verwenden. (context und database).

Ich nehme an, eine IUserAccountToken erstellen Sie müssen nur UserAccountToken.Create() aufrufen und die entsprechenden Parameter übergeben. Wenn das der Fall ist, brauchen Sie nur die zweite Registrierung.

Es wäre nur sein:

builder.Register<UserAccountToken>(c => 
{ 
    var db = c.Resolve<IUnitOfWork>(); 
    var hc = c.Resolve<HttpContextBase>(); 

    return UserAccountToken.Create(hc, db); 

}) 
    .As<IUserAccountToken>() 
    .InstancePerRequest(); 
+1

Ok, ich bin das jetzt versuchen und aktualisiert so schnell wie möglich –

+0

Wurde Ihr Problem @MarcusCobb gelöst? –

Verwandte Themen