如何在_Layout View中访问UserProfile

时间:2013-09-05 16:31:29

标签: asp.net-mvc dependency-injection structuremap

在我的MVC应用程序中,我有一个共享的_Layout.cshtml文件,显示用户的菜单

在该视图上我想显示来自UserProfile实体的信息 - 使用SimpleMembership创建并因此链接到可以直接在_Layout页面中访问的IPrincipal用户。

所以我编写了一个扩展方法,在我的UnitOfWork上进行调用,看起来像这样:

    public static UserProfile GetUserProfile(this IPrincipal u)
    {
        IUnitOfWork uow = new UnitOfWork();
        return uow.UserRepository.GetUserProfile(u);            
    }

现在这样可行,但它并不好闻,因为我正在实例化UnitOfWork而不是注入它....

我有一个如下所示的BaseController类:

public class BaseController : Controller
{
    // NOT NECESSARY TO DISPOSE THE UOW IN OUR CONTROLLERS
    // Recall that we let IoC inject the Uow into our controllers
    // We can depend upon on IoC to dispose the UoW for us
    protected MvcApplication.Data.Contracts.IUnitOfWork _Uow { get; set; }
}

(我的一些代码基于这个答案:https://stackoverflow.com/a/12820444/150342

我使用Package Manager来安装StructureMap,这段代码在应用程序启动时运行:

public static class StructuremapMvc
{
    public static void Start()
    {
        IContainer container = IoC.Initialize();
        DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
        GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
    }
}

据我所知,这会将我的具体UnitOfWork类注入我的控制器,并处理UnitOfWork的处理。

不幸的是,就我对IoC的理解而言,如果我想从Controller以外的其他地方访问UnitOfWork,我不知道该怎么办 - 或者我是否可以将信息传递给_Layout来自我的控制器。我想将数据放到_Layout页面上,我很困惑如何从那里访问UnitOfWork,或者如何将UnitOfWork注入扩展方法

1 个答案:

答案 0 :(得分:2)

将数据放入ViewBag中,让_Layout视图从那里拉出来。

您可以将其放在BaseController

protected override void Initialize(System.Web.Routing.RequestContext requestContext)
{
    base.Initialize(requestContext);
    var u = requestContext.HttpContext.User;
    var data = _UoW.UserRepository.GetUserProfile(u);

    ViewBag.UserData = data;
}

在“布局”视图中,您可以渲染数据:

@ViewBag.UserData