问题 如何在ASP.NET MVC 5.2.3应用程序的其他地方获取IAppBuilder的实例?


我需要构建一个Owin中间件对象,但不是来自内部 Startup 类。我需要在我的代码中的任何其他地方构建它,所以我需要一个引用 AppBuilder 应用程序的实例。有没有办法从其他地方获得它?


2454
2017-08-10 08:38


起源

你是如何设法坚持你在后续请求中构建的内容的?我在用户登录后为每个OWIN上下文创建了用户管理器,但在导航到其他MVC控制器时它是空的。 - Aseem Chiplonkar


答案:


你可以简单地注射 AppBuilder 本身 OwinContext。但由于Owin上下文只支持 IDisposable 对象,包装它 IDisposable 对象并注册它。

public class AppBuilderProvider : IDisposable
{
    private IAppBuilder _app;
    public AppBuilderProvider(IAppBuilder app)
    {
        _app = app;
    }
    public IAppBuilder Get() { return _app; }
    public void Dispose(){}
}

public class Startup
{
    // the startup method
    public void Configure(IAppBuilder app)
    {
        app.CreatePerOwinContext(() => new AppBuilderProvider(app));
        // another context registrations
    }
}

因此,在您的代码的任何位置都可以访问 IAppBuilder 目的。

public class FooController : Controller
{
    public ActionResult BarAction()
    {
        var app = HttpContext.GetOwinContext().Get<AppBuilderProvider>().Get();
        // rest of your code.        
    }
}

15
2017-08-10 11:20



辉煌!我为什么不这么想? :-) - Water Cooler v2
FooController中的代码不起作用。 IOwinContext.Get<T> 没有一个没有参数的方法,你必须提供一个密钥。而这个关键是由内部创建的一些奇怪的关键 CreatePerOwinContext() 以...开头 "AspNet.Identity.Own:" 和大会合格的类型名称,即 typeof(yourtype).AssemblyQualifiedName。请看我在这里的答案: stackoverflow.com/a/36044219/323456 - enorl76
@ enorl76 Get 我在这个例子中使用的方法是一个在其中实现的扩展方法 Microsoft.AspNet.Identity.Owin 部件。因此,如果您将相关的包添加到您的项目并添加 Microsoft.AspNet.Identity.Owin 文件中的命名空间也可以使用此方法。 - Sam Farajpour Ghamari
@SamFarajpourGhamari这就是为什么我真的不喜欢扩展方法。谢谢你的提示。 - enorl76