6

我有一个使用 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 来完成类似的事情?

4

1 回答 1

1

我自己遇到了这个问题,似乎 StructureMap 中的每个相关网络都被移到了一个单独的 Nuget 包StructureMap.Web中,可以在此处找到

我认为这是因为 StructureMap 3 现在与 PLC(可移植类库)兼容,因此将其移动到单独的包中是有意义的。

包含该软件包后,一切都应继续正常工作。

于 2014-04-16T13:10:21.957 回答