2016-06-05 15 views
0

Ich habe folgende Klasse für speichern und meine Benutzerdaten abrufen.Autofac SingleInstance Update fehlgeschlagen

public class AuthenticationMethod : IAuthenticationMethod 
{ 
    private readonly IUserService _userService; 
    private readonly IFormCustomizationsService _formCustomizationsService; 
    private readonly IGridCustomizationsService _gridCustomizationsService; 

    public virtual User CurrentUser { get; set; } 
    public virtual List<ViewFormCustomizations> CurrentFormCustomizations { get; set; } 
    public virtual List<ViewGridCustomizations> CurrentGridCustomizations { get; set; } 

    public AuthenticationMethod(IUserService userService, IFormCustomizationsService formCustomizationsService, IGridCustomizationsService gridCustomizationsService) 
    { 
     _userService = userService; 
     _gridCustomizationsService = gridCustomizationsService; 
     _formCustomizationsService = formCustomizationsService; 
    } 

    public bool LoginCurrentUser(string userName, string password) 
    { 
     CurrentUser = _userService.IsAuthenticated(userName, password); 
     if (CurrentUser == null || !CurrentUser.IsActive) 
     { 
      CurrentUser = null; 
      return false; 
     } 

     Initialize(CurrentUser); 
     return true; 
    } 

    public void LogoutCurrentUser() 
    { 
     CurrentUser = null; 
     CurrentFormCustomizations = null; 
     CurrentGridCustomizations = null; 
    } 

    public virtual void Initialize(User user) 
    { 
     CurrentUser = user; 

     InitialFormCustomizations(); 
     InitialGridCustomizations(); 
    } 

    public virtual void InitialFormCustomizations() 
    { 
     CurrentFormCustomizations = _formCustomizationsService.GetByUserId(CurrentUser.ID).ToList(); 
    } 

    public virtual void InitialFormCustomization(Guid formId) 
    { 
     RemoveFormCustomization(formId); 

     var newformCustomization = _formCustomizationsService.GetUserFormCustomization(CurrentUser.ID, formId); 
     CurrentFormCustomizations.Add(newformCustomization); 
    } 

    public virtual void RemoveFormCustomization(Guid formId) 
    { 
     CurrentFormCustomizations = CurrentFormCustomizations.Where(p => p.FormID != formId).ToList(); 
    } 

    public virtual void InitialGridCustomizations() 
    { 
     CurrentGridCustomizations = _gridCustomizationsService.GetByUserId(CurrentUser.ID).ToList(); 
    } 

    public virtual void InitialGridCustomization(Guid gridId) 
    { 
     RemoveGridCustomization(gridId); 

     var newgridCustomization = _gridCustomizationsService.GetUserGridCustomization(CurrentUser.ID, gridId); 
     CurrentGridCustomizations.Add(newgridCustomization); 
    } 

    public virtual void RemoveGridCustomization(Guid gridId) 
    { 
     CurrentGridCustomizations = CurrentGridCustomizations.Where(p => p.GridID != gridId).ToList(); 
    } 

    public ViewFormCustomizations GetFormCustomizationsById(Guid formId) 
    { 
     return CurrentFormCustomizations.SingleOrDefault(q => q.FormID == formId); 
    } 

    public ViewGridCustomizations GetGridCustomizationsById(Guid gridId) 
    { 
     return CurrentGridCustomizations.SingleOrDefault(q => q.GridID == gridId); 

    } 
} 

und ich registrieren diese Klasse als SingleInstance mit Autofac:

builder.RegisterType(typeof (AuthenticationMethod)).As(typeof (IAuthenticationMethod)).SingleInstance(); 

aber wenn mein Benutzer oder Benutzer-Info (formCustomization oder GridCustomization) ändern und ich möchte, dass meine AuthenticationMethod mit neuen Daten neu zu laden (für Beispiel Funktion InitialFormCustomization) wenn ich meine einzelne Instanz in anderer Form mit Autofac Resolve verwenden möchte, gibt alte Daten anstelle von neu aktualisierten Daten zurück ... Wie kann ich mein Problem lösen?


Antwort

1

Single instance arbeitet genau, wie Sie es angegeben - es ein Singleton zurückgibt. Aber Ihre Daten sind nur für den aktuellen Benutzer. Dies ist ein Problem, wenn alle Benutzer dieselbe Instanz des Objekts verwenden.

Im Allgemeinen sollten Dienste keinen Status mit ihnen verbunden haben. State ist Laufzeitdaten, die normalerweise pass through the methods of application services sollte.

Aber abgesehen davon müssen Sie einen anderen Weg planen, Ihren Zustand zu speichern, als ihn in den DI-Container zu legen. Wenn dies eine Webanwendung ist, kann der Sitzungsstatus eine Option sein, oder lesen Sie Think twice about using session state für einige mögliche (bessere) Alternativen.