2013-05-28 6 views
4

Новое веб-приложение MVC 4 с использованием autofac 3.0 на IIS 7.5. Как я ввожу зависимость в IHttpModule?autofac - инъекция зависимостей в IHttpModule

Я попробовал инъекции конструктора, который привел к:

Конструктор по типу «AnonymousIdentityModule» не найден

Таким образом, кажется, что внутренние органы требуют конструктор без параметров для HTTP модулей. Я также попробовал вложение свойств, но это не привело к тому, что фактически не была введена зависимость.

Регистрация

builder.RegisterType<AnonymousIdentityModule>().As<IHttpModule>().PropertiesAutowired().InstancePerHttpRequest(); 

IHttpModule Код

public class AnonymousIdentityModule : IHttpModule 
{ 
    private readonly IServiceManager _serviceManager; 

    // this causes "constructor not found" exception 
    public AnonymousIdentityModule(IServiceManager serviceManager) 
    { 
     _serviceManager = serviceManager; 
    } 

    // never assigned by autofac 
    public IServiceManager ServiceManager 
    { 
     get { return _serviceManager; } 
     set { _serviceManager = value; } 
    } 
    ... 
} 

web.config

<system.webServer> 
    <validation validateIntegratedModeConfiguration="false" /> 
    <modules> 
     <add name="AnonymousIdentityModule" type="AnonymousIdentityModule" /> 
    </modules> 
    </system.webServer> 

I foun d этот старый article относящийся к Виндзору, но не имеющий аналогов в autofac.

ответ

7

Проверьте этот SO вопрос: IoC Dependency injection into Custom HTTP Module - how? (ASP.NET)

и этот пост Фил Хаака: http://haacked.com/archive/2011/06/02/dependency-injection-with-asp-net-httpmodules.aspx

Они оба говорят о предоставлении DI в HttpModules путем создания другой HttpModule для их инициализации. И PH предоставил NuGet пакет его HttpModuleMagic, если вы хотите:

PM> Install-Package HttpModuleMagic 

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

Так что, если вам нужна каждый запрос зависимость, проверить это сообщение: http://www.sapiensworks.com/blog/post/2013/03/18/Http-Module-Dependecy-Injection-with-Autofac-Gotcha.aspx

Это выглядит при использовании функции Factory, чтобы получить правильно контекстную зависимость, когда это необходимо.

+1

Я пробовал HtpModuleMagic в сочетании с этой статьей sapiensworks и первым запросом работал, но последующие запросы бросали ошибки об удаляемом DbContext. Мой менеджер сервисов имеет длинную цепочку зависимостей, включая инфраструктуру сущности, которую я предполагаю, чтобы все объекты были правильно созданы. Я решил просто поместить мой код в базовый контроллер и убрать все мои контроллеры. Гораздо чище, чем переписывать тонны кода, чтобы добиться инъекции в одном глупом модуле http. – TugboatCaptain

+0

@TugboatCaptain, это было долгое время, но обычно объявляя зависимость от фабрики для данного типа (называть его «MyService») так же просто, как в зависимости от 'Func >'. Вам не нужно писать заводской код, Autofac делает это за вас. –

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