Asp.net mvc 2 使用Structuremap自定义实例注入当前用户

Asp.net mvc 2 使用Structuremap自定义实例注入当前用户,asp.net-mvc-2,structuremap,n-tier-architecture,Asp.net Mvc 2,Structuremap,N Tier Architecture,以下是我试图做的: 我已经在ASP.NET MVC中实现了表单身份验证。我有符合IPrincipal(System.Security.Principal)的IUser接口。自定义IUser具有其他属性,可以视为DTO。我需要在不同的层中使用这个用户 当前,我的基本控制器检查表单是否经过身份验证,并将IUser重新构建为代码。我将当前用户传递给服务层,服务层将其传递给域层,然后它将传递给事件和事件处理程序(域事件) 所有层都基于接口,StructureMap用作IoC。 我的IoC是一个独立的类库

以下是我试图做的: 我已经在ASP.NET MVC中实现了表单身份验证。我有符合IPrincipal(System.Security.Principal)的IUser接口。自定义IUser具有其他属性,可以视为DTO。我需要在不同的层中使用这个用户

当前,我的基本控制器检查表单是否经过身份验证,并将IUser重新构建为代码。我将当前用户传递给服务层,服务层将其传递给域层,然后它将传递给事件和事件处理程序(域事件)

所有层都基于接口,StructureMap用作IoC。 我的IoC是一个独立的类库

我正在寻找一种方法来避免将用户信息传递给每一种方法。我发现我可以按照链接中的描述注入类的自定义实例

我计划创建一个方法

public void SetCurrentUser(IUser user)
{
    // Something Similart to below ( Below code may be wrong)

    //For<IUser>().TheDefault.IsThis(user);

}
For().HybridHttpOrthReadLocalScope().Use(容器=>{
buildUserInstanceFromThreadCurrentPrincipal();
});

@Joshua-Wow从来不知道buildUserInstanceFromThreadCurrentPrincipal()这样的东西存在。非常感谢。“我今天要试试这个。”约书亚-:-)跳得太快,没有发表评论。我首先想到buildUserInstanceFromThreadCurrentPrincipal()是一个框架方法。@Joshua-我正在调用我的IoC库,它在不同项目中的所有注册表模块上调用init。我可以调用上述代码的最早生命周期事件是什么?我想如果我把它放在请求身份验证中,那么它将为每个请求调用,基本控制器似乎仍然是最好的地方。有什么建议吗?@TheMar-注册码通常放在应用程序启动中,因为它只应该运行一次。我能够使用Joshua Flanagan的建议成功地进行测试。
string[] roles = userData.Split(',');
// Create a new Generic Principal Instance and assign to Current User
IUser _currentUser= new User
{
    IsApplicationUser = Convert.ToBoolean(roles[0].ToString()),
    Role = (UserRole)Enum.Parse(typeof(UserRole), roles[1].ToString()),
    Id = new Guid(ticket.Name),
    Email = roles[3].ToString(),
    Name = roles[2].ToString(),
    CompanyName = roles[4].ToString(),
    DealerId = roles[5].ToString(),
    LocationId  = roles[6].ToString()
};
For<IUser>().HybridHttpOrThreadLocalScoped().Use( container => {
    buildUserInstanceFromThreadCurrentPrincipal();
});