我有一个使用 2.x 版 Structuremap 的最后一个构建的现有应用程序,它工作正常。StructureMap 3 最近刚刚上线,我决定尝试对其进行更新,看看效果如何。
但是,无论我做什么,我似乎都无法正确解析当前用户。我不确定它是否试图在应用程序的生命周期中过早地构建依赖关系,或者交易可能是什么。由于发布时间如此之近,因此几乎没有我发现任何有用的信息。
注册依赖的行。
For<HttpContextBase>().Use(() => new HttpContextWrapper(HttpContext.Current));
For<ICurrentUser>().HybridHttpOrThreadLocalScoped().Use(x => GetCurrentUser(x));
我解决依赖关系的方法
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);
}
}
我的 ICurrentUser 界面
public interface ICurrentUser
{
Guid UserId { get; }
string UserName { get; }
}
行调用GetIdentityId()
基本上只是一个扩展方法,它包装了逻辑以检查存储在 Identity 上的 UserId 作为类型的声明项ClaimTypes.NameIdentifier
、处理空值并合并到 Guid 等。
有没有其他人尝试在 web 应用程序中使用 StructureMap3 来完成类似的事情?