2013-12-02 3 views
4

У меня возникла большая проблема при инъекции httpContextBase в мой объект уровня сервиса, введенный в контроллер с использованием единства.mvc, вводящий httpcontext в сервисный уровень

Контроллер образца

public HomeController : Controller{ 
    private IWorkContext _context; 

    public HomeController(IWorkContext context){ 
     _context = context; 
    } 

} 


public WorkContext : IWorkContext{ 

    private HttpContextBase _httpContext; 

     public (HttpContextBase httpContext){ 
      _httpContext = httpContext; 
     } 

     public void DealWithCookies(){ 
      //do some thing with http context and deal with cookies 
     } 
    } 

Внутри единства загрузчике

container.RegisterType<HttpContextBase>().RegisterInstance(new HttpContextWrapper(HttpContext.Current) as HttpContextBase, new ContainerControlledLifetimeManager()); 

//With this line httpcontextbase is returned but as a singleton instead of new for each request. 


    container.RegisterType<HttpContextBase>().RegisterInstance(new HttpContextWrapper(HttpContext.Current) as HttpContextBase, new PerRequestLifetimeManager()); 

//This line returns an exception 

Тип HttpContextBase не имеет доступного конструктора.

ответ

2

Я не впрыскивать HttpContext вообще - я бы передать его в каждом вызове метода:

public WorkContext : IWorkContext{ 

    private HttpContextBase _httpContext; 

    public WorkContext(){ 
     ... 
    } 

    public void DealWithCookies(HttpContext ctx){ 
     //do some thing with http context and deal with cookies 
    } 
} 

Попытка использовать зависимость инъекций здесь, кажется, растрата принципа для меня. Инъекционная инъекция позволяет вам свободно сочетать ваши компоненты, но здесь нет необходимости, так как вы можете передать контекст в методы и манипулировать им напрямую. Нет никакого интерфейса, чтобы обеспечить конкретную реализацию, поэтому нет никакой пользы для DI - это просто ненужная загрузка и отсутствие структуры с анти-шаблоном.

Не говоря уже о том, что вы не сможете это сделать, учитывая, что при регистрации типов при запуске приложения нет экземпляра для регистрации (и экземпляр должен быть изменен при каждом запросе).

На боковой ноте - я надеюсь, что IWorkContext предназначен исключительно для абстрагирования логики cookie и не является слоем между вашим приложением и вашим уровнем данных. Если нет, он не должен иметь зависимости от контекста HTTP вообще.

0

FYI Вы можете издеваться контекст HTTP в контроллер в соответствии с настоящей статьей на TDD и MVC:

http://msdn.microsoft.com/en-us/library/ff847525(v=vs.100).aspx

Failing что впрыснуть экземпляр реализации HttpContextBase выполните следующие действия (работает в моих проектах !!):

container.RegisterType (new InjectionFactory (c => новый HttpContextWrapper (HttpContext.Current)));

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