Autofac DI无法在API控制器上运行

时间:2014-10-17 14:24:50

标签: c# asp.net-mvc-5 autofac owin asp.net-web-api2

我很难用这个。我的设置适用于普通的MVC控制器,但不适用于API控制器。不确定我做错了什么。

这是我的容器设置。

IContainer Container = null;
ContainerBuilder builder = new ContainerBuilder();
builder.RegisterControllers(System.Web.Compilation.BuildManager.GetGlobalAsaxType().BaseType.Assembly).PropertiesAutowired().InstancePerRequest().InstancePerDependency();
builder.RegisterApiControllers(System.Web.Compilation.BuildManager.GetGlobalAsaxType().BaseType.Assembly).PropertiesAutowired().InstancePerRequest().InstancePerDependency();
builder.RegisterModule<LoggerModule>();

builder.Register(c =>
{
    // if we don't have owin context ready then just create a new one
    if (HttpContext.Current == null || HttpContext.Current.Items["owin.Environment"] == null)
    {
        return UserManager.Create(new IdentityFactoryOptions<UserManager>(), (System.Data.Entity.DbContext)null);
    }

    return HttpContext.Current.GetOwinContext().Get<UserManager>();
 }).As<IUserManager>().InstancePerLifetimeScope();

 Container = builder.Build();
 GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(Container);
 DependencyResolver.SetResolver(new AutofacDependencyResolver(Container));

所以现在我有了我的基本控制器

[Authorize]
public TasksController : ApiController
{
    public ILogger Logger { get; set; }
    public IUserManager UserManager { get; set; }

    public string Get()
    {     
        //logger works, but the usermanager is null
        this.Logger.Info("Entering Get");       
        return this.UserManager.CurrentUser.Name;
    }
}

[Authorize]
public UserController : Controller
{
    public ILogger Logger { get; set; }
    public IUserManager UserManager { get; set; }

    public ActionResult Index()
    {     
        //logger works, AND the usermanager is set too.
        this.Logger.Info("Entering Index");       
        return this.View(this.UserManager.CurrentUser);
    }
}

所以奇怪的部分是MVC控制器工作正常。我有ILoggerIUserManager个实例。但在我的Api控制器中,我只有一个ILogger实例。 IUserManager为空。

如果我想,我可以在Api控制器中执行此操作以获取实例。

((Autofac.Integration.Mvc.AutofacDependencyResolver)System.Web.Mvc.DependencyResolver.Current).RequestLifetimeScope.Resolve<IUserManager>();

我也可以使用自定义模块设置IUserManager属性(我在现有的LoggerModule中对此进行了测试),但我想了解为什么它不能通过只是注册类型。我不想在不完全理解我做错的情况下继续治疗症状。

0 个答案:

没有答案