2016-06-05 2 views
0

다음 사용자 클래스의 데이터를 저장하고 가져 오는 클래스가 있습니다.Autofac SingleInstance 업데이트가 실패했습니다.

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

    } 
} 

나는 autofac와 singleInstance로이 클래스를 등록 :

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

하지만 내 사용자 또는 사용자의 정보 (formCustomization 또는 GridCustomization) 변화와 나는 새로운 데이터로 내 인증 방식을 (다시로드 할 때 예제 함수 InitialFormCustomization) Autofac Resolve을 사용하여 다른 인스턴스에서 단일 인스턴스를 사용하려면 새로 업데이트 된 데이터 대신 이전 데이터가 반환됩니다 ... 문제점을 어떻게 해결할 수 있습니까?


답변

1

Single instance 정확히 지정한대로 작동합니다. 즉, 싱글 톤을 반환합니다. 그러나 귀하의 데이터는 현재 사용자를위한 것입니다. 모든 사용자가 동일한 객체 인스턴스를 공유하면 문제가됩니다.

일반적으로 서비스에는 관련 상태가 없어야합니다. 상태는 보통입니다.

하지만 그 외에도 DI 컨테이너에 넣는 것보다 상태를 저장하는 다른 방법을 계획해야합니다. 이것이 웹 응용 프로그램 인 경우 세션 상태가 하나의 옵션 일 수 있으며 가능한 (더 나은) 대체 방법은 Think twice about using session state입니다.

관련 문제