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?
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. –