Разрешение IOwinContext в приложении MVC5 с использованием Autofac
У меня проблемы с использованиемMembershipReboot
с новым шаблоном ASP MVC5 иAutofac
, Я использовал шаблон MVC5 по умолчанию для настройки сайта, а затем попытался подключитьMembershipReboot
фреймворк как замена для фреймворка ASP Identity, который поставляется с шаблоном.
Эта проблема, которую я имею, пытается решитьIOwinContext
отAutofac
контейнер. Вот моя проводка в классе Startup (сокращено до основ). Это проводка, использованная в образцах дляMembershipReboot Owin
приложение (кроме того, что он использует Нэнси).
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
никогда не зарегистрирован.
Что я здесь не так делаю?
ОБНОВИТЬ:
Брок, твой новый пример отлично работает, когда я переношу конфигурацию в свой проект. Просто для моего понимания, кажется, что эта строка в вашем новом примере регистрирует текущий OwinContext с контейнером, и это то, что ранее отсутствовало.
builder.Register(ctx=>HttpContext.Current.GetOwinContext()).As<IOwinContext>();
В том, что