我在使用MembershipReboot
新的 ASP MVC5 模板和Autofac
. 我使用默认的 MVC5 模板来设置站点,然后尝试连接MembershipReboot
框架以替代模板附带的 ASP Identity 框架。
我遇到的这个问题是试图IOwinContext
从Autofac
容器中解决。这是我在 Startup 课程中的接线(简化为基础知识)。这是MembershipReboot Owin
应用程序示例中使用的接线(除了他使用 Nancy)。
public partial class Startup
{
public void Configuration(IAppBuilder app)
{
var builder = new ContainerBuilder();
builder.RegisterControllers(Assembly.GetExecutingAssembly());
builder.Register(c => new DefaultUserAccountRepository())
.As<IUserAccountRepository>()
.As<IUserAccountQuery>()
.InstancePerLifetimeScope();
builder.RegisterType<UserAccountService>()
.AsSelf()
.InstancePerLifetimeScope();
builder.Register(ctx =>
{
**var owin = ctx.Resolve<IOwinContext>();** //fails here
return new OwinAuthenticationService(
MembershipRebootOwinConstants.AuthenticationType,
ctx.Resolve<UserAccountService>(),
owin.Environment);
})
.As<AuthenticationService>()
.InstancePerLifetimeScope();
var container = builder.Build();
DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
ConfigureAuth(app);
app.Use(async (ctx, next) =>
{
using (var scope = container.BeginLifetimeScope(b =>
{
b.RegisterInstance(ctx).As<IOwinContext>();
}))
{
ctx.Environment.SetUserAccountService(() => scope.Resolve<UserAccountService>());
ctx.Environment.SetAuthenticationService(() => scope.Resolve<AuthenticationService>());
await next();
}
});
}
这是我的控制器,它具有在控制器构造函数中指定的依赖项。
public class HomeController : Controller
{
private readonly AuthenticationService service;
public HomeController(AuthenticationService service)
{
this.service = service;
}
public ActionResult Index()
{
return View();
}
public ActionResult About()
{
ViewBag.Message = "Your application description page.";
return View();
}
public ActionResult Contact()
{
ViewBag.Message = "Your contact page.";
return View();
}
}
似乎我需要将Autofac
容器包装在一个容器中AutofacDependencyResolver
,以便 MVC 框架使用容器来解析组件。这是与Nancy Owin
示例和我在 MVC5 中使用的唯一主要区别。
当我这样做时,看起来(从我的跟踪中)好像在没有首先通过OWIN middleware
堆栈的情况下解决了依赖关系,因此IOwinContext
从未注册过。
我在这里做错了什么?
更新:
Brock,当我将配置迁移到我的项目时,您的新示例运行良好。仅出于我的理解,您的新示例中的这一行似乎将当前的 OwinContext 注册到容器中,而这正是以前所缺少的。
builder.Register(ctx=>HttpContext.Current.GetOwinContext()).As<IOwinContext>();
就是它