代码之家  ›  专栏  ›  技术社区  ›  asdf_enel_hak

如何通过名称告诉您如何使用相关的已注册MySession类

  •  0
  • asdf_enel_hak  · 技术社区  · 7 年前

    我已经创建了一个项目 Boilerplate

    我有一个MySession类,它将从MvcControllers和WebApi控制器中使用。

    MySessionMvc:

     public override string UserId {
      get {
    
       return Thread.CurrentPrincipal.Identity.GetUserId();
      }
     }
    

    和

    MySessionWebApi:

     public override string UserId {
      get {
    
       System.Web.HttpContext.Current.Request.Headers["UserId"];
      }
     }
    

    我注册了两个班级:

    IocManager.RegisterIfNot<IMySession, MySessionMvc>(DependencyLifeStyle.Singleton, "MyNamespace.MySessionMvc");
    
    IocManager.RegisterIfNot<IMySession, MySessionWebApi>(DependencyLifeStyle.Singleton, "MyNamespace.MySessionWebApi");
    

    现在是时候告诉相关控制器将使用哪个MySession派生类了。


    我明白了,现在我可以很容易地将它注入我的控制器

    protected MyBaseController(IWindsorContainer container)
    {
        MySession = container.Resolve<IMySession> "MyNamespace.MySessionWebApi");
    }
    

    在控制器级别,我实现了我的目标。

    namespace My.Auditing
    {
        internal class AuditingInterceptor : IInterceptor
        {
            public IMySession MySession { get; set; }
    
        }
    }
    

    我如何才能在拦截器级别正确解析相关的MySession?

    1 回复  |  直到 7 年前
        1
  •  0
  •   asdf_enel_hak    7 年前
    IocManager.IocContainer.Register(
        Component.For<MySessionWebApi>().LifestylePerWebRequest(), Component.For<MySessionMvc>().LifestylePerWebRequest(),
        Component.For<IMySession>().UsingFactoryMethod((k, c) => this.MySessionFactory(k)).LifestylePerWebRequest().IsDefault());
    
    
     private IMySession MySessionFactory(IKernel kernel)
    {
            if (System.Web.HttpContext.Current.Request == null)
            {
                return (IMySession)kernel.Resolve<MySessionMvc>();  
    
            }
            if (System.Web.HttpContext.Current.Request.Path.Contains("/api/"))
            {
                return (IMySession)kernel.Resolve<MySessionWebApi>();
            }
            else
            {
                return (IMySession)kernel.Resolve<MySessionMvc>();
            } 
    }
    

    这就是所有的人!