Адаптация Autofac для Castle Windsor

Я хочу использовать Castle Windsor для регистрации FakeHttpContext, когда HttpContext недоступен. Может ли кто-нибудь помочь мне перевести следующую Автофак-регистрацию в Castle Windsor.

        builder.Register(c => HttpContext.Current != null ? 
            (new HttpContextWrapper(HttpContext.Current) as HttpContextBase) : 
            (new FakeHttpContext("~/") as HttpContextBase))
            .As<HttpContextBase>()
            .InstancePerHttpRequest();

person andre    schedule 19.12.2011    source источник
comment
Взгляните на AddComponentInstance stackoverflow.com/questions/925244/   -  person BlackICE    schedule 19.12.2011
comment
Спасибо, но я не понимаю, как я могу добавить только FakeContext, если настоящий HttpContext недоступен. например службе нужен HttpContext, и обычно она его получит, но в некоторых случаях служба вызывается, а HttpContext недоступен. Только в этих случаях следует использовать Подделку.   -  person andre    schedule 19.12.2011


Ответы (1)


Вы можете заставить Windsor использовать фабричный метод при разрешении конкретной службы, указав его с помощью UsingFactoryMethod - в вашем случае что-то вроде этого должно помочь:

container.Register(
    Component.For<HttpContextBase>()
        .UsingFactoryMethod(k => HttpContext.Current != null
            ? (HttpContextBase)new HttpContextWrapper(HttpContext.Current)
            : new FakeHttpContext("~/"))
        .Lifestyle.PerWebRequest
);

Чтобы внедрить текущий запрос, следуйте аналогичному подходу:

container.Register(
    Component.For<HttpRequestBase>()
        .UsingFactoryMethod(k => k.Resolve<HttpContextBase>().Request)
        .Lifestyle.PerWebRequest
);
person mookid8000    schedule 19.12.2011
comment
Я получаю следующую ошибку: (Тип условного выражения не может быть определен, поскольку не существует неявного преобразования между System.Web.HttpContextWrapper и Xinga.Core.Fakes.FakeHttpContext) - person andre; 19.12.2011
comment
Я изменил ваш код следующим образом: container.Register (Component.For ‹HttpContextBase› () .UsingFactoryMethod (k = ›HttpContext.Current! = Null? New HttpContextWrapper (HttpContext.Current) as HttpContextBase: new FakeHttpContext (~ / / )); но теперь я получаю следующую ошибку: {FactoryMethodActivator`1 получил неверно настроенную компонентную модель для системы System.Web.HttpContextBase с поздним связыванием. Вы уверены, что зарегистрировали этот компонент с помощью 'UsingFactoryMethod'?} - person andre; 19.12.2011
comment
спасибо, что указали, что мне нужно явно указать тип возвращаемого значения из фабричного метода ... Я соответственно обновил образец кода - person mookid8000; 19.12.2011
comment
у вас есть странная ошибка - не могли бы вы показать мне свой код Виндзора? - person mookid8000; 19.12.2011
comment
Эта ошибка возникла из-за другой ошибки в моем коде. Я исправил это, и теперь код компилируется и запускается, но пока не работает. Я также должен перевести следующий код Autofac в Castle Windsor: builder.Register (c = ›c.Resolve ‹HttpContextBase› () .Request) .As ‹HttpRequestBase› () .InstancePerHttpRequest (); Вы знаете, как написать это для Castle? - person andre; 19.12.2011
comment
Спасибо! У меня все еще есть проблемы, чтобы заставить его работать, но мой вопрос в этой теме решен с помощью вашего решения. Мне очень жаль, что я не могу проголосовать за вас, потому что у меня еще недостаточно привилегий. Я надеюсь, что смогу сделать это позже. - person andre; 19.12.2011
comment
Сегодня у меня достаточно репутации, чтобы проголосовать за вас. В очередной раз благодарим за помощь. - person andre; 17.01.2012