2013-04-09 1 views
1

Отказ от ответственности: у меня есть немного опыта с контейнерами DI, но я совершенно новый для Unity.Как получить Unity, чтобы ввести ссылку на HttpSessionState на службу

У меня есть проект MVC, который все подключен к Unity DI, используя инъекцию конструктора и отлично работает. Но теперь у меня есть служба, которую я хочу внедрить в мои контроллеры (а может быть, и места, отличные от контроллеров, в какой-то момент), и эта служба нуждается в доступе к состоянию сеанса ASP.NET. Целью службы является управление списком в сеансе, и я не хочу, чтобы в моем контроллере была механика списка.

Я понимаю, что я мог бы добавить метод установки к сервису (и его интерфейсу), который мой контроллер мог вызвать, передав ссылку на сеанс, перед использованием службы, но мне это не нравится, поскольку я могу сделать реализацию службы, которая использует что-то другое, кроме Session для моего управления состоянием, а также специфические особенности реализации, протекающие в моем интерфейсе. Я также понимаю, что могу использовать HttpContext.Current в своей службе, но я не хочу делать это по многим причинам, особенно по тем проблемам, которые он создает для модульного тестирования.

Может ли Unity вставить ссылку на HttpSessionState в конструктор службы?

ответ

3

Существует несколько способов сделать это. Самый простой, вероятно, использовать инъекционный завод:

container.RegisterType<HttpSessionState>(
    new InjectionFactory(c => { return HttpContext.Current.Session; })); 

Тогда везде, где есть зависимость от HttpSessionState в графе, делегат данное будет работать и вытащить его из HttpContext.Current.

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