2016-08-10 1 views
1

Я использую Autofac и мой типы регистрации выглядит следующим образом:Регистрация Тип которым основано на заказ печенья

public class Global : HttpApplication, IContainerProviderAccessor 
{ 
    static IContainerProvider _containerProvider; 
    public IContainerProvider ContainerProvider { get { return _containerProvider; }} 

    protected void Application_Start(object sender, EventArgs e) 
    { 

     var builder = new ContainerBuilder(); 
     var myCookie = Request.Cookies["MyTestCookie"]; 

     if (myCookie != null) 
      builder.RegisterType<FirstService>().As<IService>().InstancePerRequest(); 
     else 
      builder.RegisterType<SecondService>().As<IService>().InstancePerRequest(); 

     _containerProvider = new ContainerProvider(builder.Build()); 
    } 
} 

Но это дает ошибку говоря «Запрос не доступен в этом контексте». Могу ли я зарегистрировать свои типы по-другому, чтобы иметь возможность использовать информацию от Request?

+0

Конечно, вы не можете использовать информацию из запроса, который еще не пришел на сервер! – Michael

ответ

3

Application_Start вызывается один раз во время запуска приложения и autofac контейнера построить для глобального применения, вы не хотели бы, чтобы зарегистрировать услугу, основанную на одном Request здесь.

Для того, чтобы сделать то, что вы хотите, вы можете зарегистрировать обе службы как именованную службу и добавить третью учетную запись, которая разрешает правильную именованную регистрацию на основе значения cookie. т.е.:

builder.RegisterType<FirstService>().Named<IService>("first").InstancePerRequest(); 
builder.RegisterType<SecondService>().Named<IService>("second").InstancePerRequest(); 


builder.Register(c => { 
    var myCookie = HttpContext.Current.Request.Cookies["MyTestCookie"]; 

    if (myCookie != null) 
     return c.ResolveNamed<IService>("first"); 
    else 
     return c.ResolveNamed<IService>("second"); 
}).InstancePerRequest(); 
+0

Только что понял, что мне нужно разрешить запрос, и, конечно, мой подход совершенно неправильный. Кирилл, большое спасибо! Это прекрасно работает. – serg

Смежные вопросы