Resolvendo IOwinContext no aplicativo MVC5 usando o Autofac
Tenho problemas para usarMembershipReboot
com o novo modelo ASP MVC5 eAutofac
. Eu usei o modelo MVC5 padrão para configurar o site e tentei conectar oMembershipReboot
como substituto da estrutura de identidade ASP que acompanha o modelo.
Este problema que estou tendo está tentando resolver um problemaIOwinContext
deAutofac
recipiente. Aqui está minha fiação na classe Inicialização (resumida ao básico). Essa é a fiação usada nas amostras para oMembershipReboot Owin
aplicação (exceto lá ele usa 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();
}
});
}
E aqui está o meu controlador com a dependência especificada no construtor do controlador.
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();
}
}
Parece que preciso embrulhar meuAutofac
recipiente em umAutofacDependencyResolver
para que a estrutura MVC use o contêiner para resolver componentes. Essa é a única grande diferença em relação aoNancy Owin
amostra e meu uso no MVC5.
Quando faço isso, parece (pelo meu Rastreio) como se a dependência estivesse sendo resolvida sem antes passar peloOWIN middleware
empilhar para que oIOwinContext
nunca é registrado.
O que eu estou fazendo errado aqui?
ATUALIZAR:
Brock, seu novo exemplo funciona perfeitamente quando eu migro a configuração para o meu projeto. Apenas para meu entendimento, parece que esta linha em seu novo exemplo registra o OwinContext atual com o contêiner e é isso que estava faltando anteriormente.
builder.Register(ctx=>HttpContext.Current.GetOwinContext()).As<IOwinContext>();
É aquele