Как сказать использовать соответствующий зарегистрированный класс MySession по имени - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть проект, созданный из Boilerplate

У меня есть класс MySession, который будет использоваться из MvcControllers и контроллеров WebApi.

В 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");
}

И на уровне контроллера я достигну своей цели.

С другой стороны, я должен сказать Auditor-перехватчику сказать то же самое разрешение зависимостей.Этот перехватчик получает информацию об идентификаторе пользователя из MySession.

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

    }
}

Как я могу продолжить, чтобы я мог правильно разрешить соответствующую MySession на уровне перехватчика?

1 Ответ

0 голосов
/ 03 января 2019
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>();
        } 
}

Вот и все, ребята!

...