ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

c# – ASP.net 4.6 MVC 5每个会话的Autofac对象

2019-07-02 16:56:13  阅读:186  来源: 互联网

标签:c asp-net asp-net-mvc autofac


在我的ASP.net MVC应用程序中,我想为每个会话应“导出”的对象设置一个值.我试过这样的:

我想要的对象:

    public class Core : ICore {

    public Core() {
        UserSession = new UserSession();
    }

    public UserSession UserSession { get; set; }
}

Global.asax中:

protected void Application_Start() {

        var builder = new ContainerBuilder();
        //register ICore
        builder.RegisterType<Core.Core>().As<ICore>().InstancePerLifetimeScope();
        builder.RegisterControllers(typeof (MvcApplication).Assembly);
        builder.RegisterFilterProvider();
        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        BundleConfig.RegisterBundles(BundleTable.Bundles);

        AreaRegistration.RegisterAllAreas();
        RouteConfig.RegisterRoutes(RouteTable.Routes);
    }

我将值设置为对象的位置(UserController):

public class UserController : BaseController {
    private readonly ICore _core;
    private readonly IUserDomain _userDomain;

    public UserController(ICore core, IUserDomain userDomain) {
        _core = core;
        _userDomain = userDomain;
    }

    [HttpPost]
    [AllowAnonymous]
    public ActionResult Login(LoginForm form) {

        if (ModelState.IsValid) {
            var user = _userDomain.GetByName(form.Username);
            if (user != null) {
                // Set Value
                _core.UserSession.CurrentUser = user;

                return RedirectToAction("Index", "Home");
            }
        }
        return View(form);
    }
}

我需要此Session对象的位置

同一申请中的第一名:
(这里ICore不为null,但我之前在Controller中设置的CurrentUser为null)

    public class ClaimsAuthorize : AuthorizeAttribute {

    public ICore Core { get; set; }

    protected override bool AuthorizeCore(HttpContextBase httpContext) {
        //Here is CurrentUser null
        var currentUser = Core.UserSession.CurrentUser;
        return currentUser != null;
    }
}

另一个项目中的第二个(SQL上下文):

public class BaseContext <TModel> where TModel : BaseModel {
    protected readonly ICore Core;
    protected NHibernateSession NHibernateSession;

    public BaseContext(ICore core) {
        Core = core;
    }

    public virtual bool Save(TModel model) {
        if (Core.UserSession.CurrentUser == null) {
            return false;
        }
        model.CreatedBy = Core.UserSession.CurrentUser.Id;
        model.CreatedAt = DateTime.Now;
        using (var session = NHibernateSession.SessionFactory.OpenSession()) {
            using (var transaction = session.BeginTransaction()) {
                session.Save(model);
                transaction.Commit();
            }
        }
        return true;
    }
}

    public class PageContext : BaseContext<Page>, IPageContext {

    public PageContext(ICore core, NHibernateSession nHibernateSession) : base(core) {
        NHibernateSession = nHibernateSession;
    }
}

解决方法:

在您的global.asax中,您可以像这样注册ICore:

builder.Register(c =>
{
    if (HttpContext.Current == null)
    {
        throw new Exception("no httpcontext available");
    }

    ICore core = HttpContext.Current.Session["ICore"] as ICore;
    if (core == null)
    {
        core = new Core();
        HttpContext.Current.Session["ICore"] = core;
    }

    return core;
}).As<ICore>();

在这种情况下,每次Autofac将解析ICore时,它将查看会话并在需要时向其添加新实例.

标签:c,asp-net,asp-net-mvc,autofac
来源: https://codeday.me/bug/20190702/1358108.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有