gpt4 book ai didi

asp.net-mvc - 使用 Autofac 解析 MVC5 应用程序中的 IOwinContext

转载 作者:行者123 更新时间:2023-12-02 00:13:27 25 4
gpt4 key购买 nike

我在将 MembershipReboot 与新的 ASP MVC5 模板和 Autofac 一起使用时遇到问题。我使用默认的 MVC5 模板来设置站点,然后尝试连接 MembershipReboot 框架作为模板附带的 ASP Identity 框架的替代品。

我遇到的这个问题是尝试从 Autofac 容器解析 IOwinContext 。这是我在启动类中的接线(精简到基础)。这是 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();
}
});
}

这是我的 Controller ,其依赖项在 Controller 构造函数中指定。

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>();

就是这个

最佳答案

有一个较新的示例,使用 AutoFac for MVC 进行 DI:

https://github.com/brockallen/BrockAllen.MembershipReboot/blob/master/samples/SingleTenantOwinSystemWeb/SingleTenantOwinSystemWeb/Startup.cs

看看这是否有帮助。

如果您不想使用HttpContext.Current,您可以执行以下操作:

app.Use(async (ctx, next) =>
{
// this creates a per-request, disposable scope
using (var scope = container.BeginLifetimeScope(b =>
{
// this makes owin context resolvable in the scope
b.RegisterInstance(ctx).As<IOwinContext>();
}))
{
// this makes scope available for downstream frameworks
ctx.Set<ILifetimeScope>("idsrv:AutofacScope", scope);
await next();
}
});

这就是我们在内部为某些应用所做的事情。您需要连接 Web API 服务解析器来查找“idsrv:AutofacScope”。 Tugberk 有一篇关于此的帖子:

http://www.tugberkugurlu.com/archive/owin-dependencies--an-ioc-container-adapter-into-owin-pipeline

关于asp.net-mvc - 使用 Autofac 解析 MVC5 应用程序中的 IOwinContext,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21703268/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com