我有一个根据Boilerplate创建的项目
我有MySession类,将在MvcControllers和WebApi Controllers中使用。
在MySession中有两个派生类:
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");
}
在控制器级别,我实现了目标。
另一方面,我需要告诉Auditing拦截器说相同的依赖项解析。该拦截器从MySession获取UserId信息。
namespace My.Auditing
{
internal class AuditingInterceptor : IInterceptor
{
public IMySession MySession { get; set; }
}
}
如何继续在拦截器级别正确解析相关的MySession?
答案 0 :(得分:0)
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>();
}
}
这就是所有人!