2014-04-03 12 views
6

Mam istniejącą aplikację przy użyciu ostatniego kompilacji z wersji 2.x Structuremap i działa poprawnie. StructureMap 3 niedawno został opublikowany i postanowiłem spróbować go zaktualizować i zobaczyć, jak to działa.Wstrzyknięcie zależności bieżącego użytkownika w aplikacji MVC przy użyciu StructureMap3

Jednak bez względu na to, co robię, nie mogę sprawić, że poprawnie rozpozna bieżącego użytkownika. Nie jestem pewien, czy próbuje on budować zależności zbyt wcześnie w całym okresie użytkowania aplikacji, czy też może to być umowa. Ponieważ wydanie tak niedawne, nie ma tam praktycznie żadnych informacji, które jak dotąd znalazłem.

Linia rejestrująca zależność.

For<HttpContextBase>().Use(() => new HttpContextWrapper(HttpContext.Current)); 
For<ICurrentUser>().HybridHttpOrThreadLocalScoped().Use(x => GetCurrentUser(x)); 

Moja metoda rozwiązywania zależność

private ICurrentUser GetCurrentUser(IContext context) 
    { 
     try 
     { 
      var httpContext = context.GetInstance<HttpContextBase>(); 
      if (httpContext == null) return null; 
      if (httpContext.User == null) return null; 
      var user = httpContext.User; 
      if (!user.Identity.IsAuthenticated) return null; 

      var personId = user.GetIdentityId().GetValueOrDefault(); 
      return new CurrentUser(personId, user.Identity.Name); 
     } 
     catch (Exception ex) 
     { 
      context.GetInstance<ILogger>().Error("Error trying to determine the current user.", ex); 
      throw new Exception("Error trying to determine the current user.", ex); 
     } 
    } 

Mój interfejs ICurrentUser

public interface ICurrentUser 
{ 
    Guid UserId { get; } 
    string UserName { get; } 
} 

Linia nazywając GetIdentityId() jest w zasadzie tylko metodę rozszerzenia owijania logiki, aby sprawdzić identyfikator użytkownika przechowywanych na Tożsamość jako pozycja roszczenia typu ClaimTypes.NameIdentifier, obsługująca wartości zerowe i łącząca się z Guidem itp.

Czy ktoś jeszcze próbował używać StructureMap3 w webappie do czegoś podobnego jeszcze?

Odpowiedz

1

Po napotkaniu tego problemu, wydaje się, że każda sieć powiązana z StructureMap została przeniesiona do osobnego pakietu Nuget o nazwie StructureMap.Web, który może być found here.

Zakładam, że jest tak dlatego, że StructureMap 3 jest teraz zgodna ze standardem PLC (Portalble Class Library), więc przeniesienie jej do oddzielnego pakietu miałoby sens.

Po dołączeniu tego pakietu wszystko powinno dalej działać normalnie.

+0

Widziałem to również, ale jest to związane z nowym pakietem StructureMap.Web. Przyjmę kolejne spojrzenie, gdy tylko będę miał czas, aby wypróbować to ponownie. –

Powiązane problemy