我试图创建一个OwinMiddleware对象来注册管道,从传入的请求中提取一些信用,并将它们应用到我们服务容器中的服务。这样做的结果是,我们在控制器中使用的需要auth的服务将到达pre-authed,这意味着控制器不再需要拔出授权头和主体,我可以删除大量的管道,将这些值传递给几个层。
我们使用DependencyInjection(Microsoft.Extensions.DependencyInjection),更重要的是这个authed服务是作用域,这意味着它需要根据请求创建和销毁(即,否则它可能会意外地使用先前请求中的信用) )。它的设置是通过一个使用ServiceCollection的IDependencyResolver的相当简单的实现来实现的。范围界定通过.BeginScope()方法工作,我不太了解,因为我无法通过HttpConfiguration.IDependencyResolver找到实际调用.BeginScope()的源代码,我有点得到它的结果但不是完全。它运作良好。
现在我从OwinMiddleware继承的对象的问题是我似乎无法通过IDependencyResolver与相关的作用域对象进行通信。
由于我不能控制OwinMiddleware对象的创建,我所能做的就是在构造函数中指定我想要与之交互的服务。然而,这看起来似乎毫无用处,因为它似乎没有给我在管道中的相同实例,而不是我在这里(我假设因为它是作用域的?)。
即使我将IDependencyResolver放入构造函数中,我仍然无法获得正确的服务实例。我可以验证中间件正在执行。
我看到其他人前段时间谈论能够用额外的参数覆盖OwinMiddleware的Invoke()函数,这解决了范围问题。如果中间件仅创建一次,因为任何作用域构造函数依赖项将被第二个请求过时,这似乎是有意义的。在管道操作期间添加依赖项对我来说更有意义。然而,对于Owin lib的版本,我有(v3)只有:
public abstract Task Invoke(IOwinContext context);
在基础上定义,因此我可以告诉我,中间件中额外服务的唯一入口点是通过构造函数。我需要不同的版本吗?我是否需要调用其他特殊的东西来通知管道根据请求构建我的中间件的新实例?
这blog entry似乎表明这将在aspnet 5中修复,我相信我已经开始了。那么它是如何以及在哪里修复的?
......事情并非如此 想要传入具有自己的依赖关系的类时清理 我们想开始使用依赖注入。自构造函数 OwinMiddleware接下来要求OwinMiddleware,我们不能简单地注册 中间件本身并允许我们的DI容器解决它 的依赖关系。
从我所看到的,如果你确实需要为你的添加另一个依赖 中间件你有两个选择:用混凝土新建它 实现(坏)或使用您的项目的依赖项传递它 解析器(反模式,MVC和Web API之间也不同)。如果 你找到任何更好的方法请告诉我,因为我很想知道和 更新此部分。这显然已经解决了ASP.NET 5, 但这对我们现在没有帮助......