我很难用这个。我的设置适用于普通的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控制器工作正常。我有ILogger
和IUserManager
个实例。但在我的Api控制器中,我只有一个ILogger
实例。 IUserManager
为空。
如果我想,我可以在Api控制器中执行此操作以获取实例。
((Autofac.Integration.Mvc.AutofacDependencyResolver)System.Web.Mvc.DependencyResolver.Current).RequestLifetimeScope.Resolve<IUserManager>();
我也可以使用自定义模块设置IUserManager属性(我在现有的LoggerModule
中对此进行了测试),但我想了解为什么它不能通过只是注册类型。我不想在不完全理解我做错的情况下继续治疗症状。