0
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

我怎样才能解决这个问题?

4

3 回答 3

2

你的代码看起来不错。我怀疑您PropertyInjectionModule在 web.config 中的 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 集成的设置。

于 2013-05-14T06:55:45.727 回答
1

尝试在构造函数中注入你的依赖项,如果你想进行属性注入,你应该启用它: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。

于 2013-05-13T11:05:08.913 回答
0

你可以试试这个

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)
 {
 }
 }
于 2013-05-15T08:25:15.993 回答