【问题标题】:How to use dependency injection in ashx (Autofac, MVC4)如何在 ashx (Autofac, MVC4) 中使用依赖注入
【发布时间】:2015-05-19 16:38:12
【问题描述】:
public class AutoCompleteCity : IHttpHandler
{
    public IAutoCompleteRepository AutoCompleteRepository { get; set; }

    public void ProcessRequest(HttpContext context)
    {
    }
}

public static void RegisterDependencies()
{
    var builder = new ContainerBuilder();

    builder.RegisterType<AutoCompleteRepository>().As<IAutoCompleteRepository>).SingleInstance();
    IContainer container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

AutoCompleteRepository注册到SingleInstance,但调用ProcessRequest时始终为null。

我该如何解决这个问题?

【问题讨论】:

  • 能发下相关的注册码吗?可能更容易发现罪魁祸首
  • 另外,试着把你的标题写成一个问题。
  • 尝试同时注册AutoCompleteCity

标签: asp.net-mvc dependency-injection autofac


【解决方案1】:

您的代码看起来不错。我怀疑您在 web.config 中的 PropertyInjectionModule httpModules 设置中缺少。 Autofac 需要以下模块设置才能与 ASP.Net 良好配合:

  <add name="ContainerDisposal" type="Autofac.Integration.Web.ContainerDisposalModule, Autofac.Integration.Web"/>
  <add name="PropertyInjection" type="Autofac.Integration.Web.Forms.PropertyInjectionModule, Autofac.Integration.Web"/>

注意:ASP.Net WebForms 集成的设置在here 中描述。

【讨论】:

  • ContainerDisposal 和 PropertyInjection 在 Autofac.Integration.Mvc 中未知
  • @YannickHammens - 请注意,这些模块不在 .Mvc 程序集中,它们在 Autofac.Integration.Web 程序集中
  • 现在出现此错误:此模块要求 HttpApplication(全局应用程序类)实现 IContainerProviderAccessor。
  • @YannickHammens - 是的,阅读我提到的 ASP.Net 集成。
  • Autofac.Web nuget 负责 web.config 设置,剩下要做的就是实现 IContainerProviderAccessor
【解决方案2】:

尝试在构造函数中注入你的依赖项,如果你想进行属性注入,你应该启用它:PropertiesAutowired(),通常使用 autofac 如果你想使用属性注入,你需要使用类的 PropertiesAutowired() 配置来启用它您要在其中获取注入的属性,而不是在您要注入的类中。

首选方式:

public class AutoCompleteCity : IHttpHandler
{
    public IAutoCompleteRepository AutoCompleteRepository { get; set; }
    public AutoCompleteCity(IAutoCompleteRepository autoCompleteRepository) {
        AutoCompleteRepository = autoCompleteRepository;
    }

    public void ProcessRequest(HttpContext context)
    {
    }

}

或者试试这个:

public static void RegisterDependencies()
{
    var builder = new ContainerBuilder();

    builder.RegisterType<AutoCompleteRepository>().As<IAutoCompleteRepository>()
           .SingleInstance();

    builder.RegisterType<AutoCompleteCity>()
      .As<IHttpHandler>()
      .PropertiesAutowired(); //<--!!!

    IContainer container = builder.Build();
    DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
}

编辑: 看这里:https://groups.google.com/forum/#!topic/autofac/BkY4s4tusUc,了解如何注册 IHttpHandler。

【讨论】:

  • 构造函数注入不适用于 ASP.Net 受控实例。 Autofac 对如何创建这些实例没有发言权。只有属性注入支持。
  • ...出于同样的原因,在容器中注册AutoCompleteCity 毫无意义,因为它永远不会通过 Autofac 解决。
  • 我的立场是正确的。但是,它需要使用路由和路由处理程序,并且仍然无法使用基于 ashx 的处理程序。
【解决方案3】:

你可以试试这个

public class AutoCompleteCity : IHttpHandler
{

 private IAutoCompleteRepository _repo;


public IAutoCompleteRepository Repository
{
   get
   {
       if (_repo==null)
       {
            _repo=AutofacDependencyResolver.Current.RequestLifetimeScope.Resolve<IAutoCompleteRepository>();           
        }
       return _repo;
   }
   set
   {
     if (value!=null) _repo=value;
   }
 }
 public void ProcessRequest(HttpContext context)
 {
 }
 }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-02
    • 1970-01-01
    • 2016-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多