我正在尝试构建一些OWIN中间件,这些中间件由Unity在Asp.NET WebApi中按请求解决 . (不是DotNetCore!)
Problem #1: 我无法弄清楚如何将 next
传递给 OwinMiddleware
实现的构造函数 . 此代码将无法编译,因为 next
是 Func<Task>
,构造函数需要类型 OwinMiddleware
.
public class CustomMiddleware : OwinMiddleware
{
public CustomMiddleware(OwinMiddleware next) : base(next)
{
}
public override async Task Invoke(IOwinContext context)
{
await Next.Invoke(context);
}
}
app.Use(async (context, next) =>
{
var middleware = new CustomMiddleware(next);
await middleware.Invoke(context);
});
我设法通过不实施 OwinMiddleware
来解决这个问题,但这感觉不对 . 当然有办法使这项工作正常吗?
Problem #2: 如前所述,我已经回避了 OwinMiddleware
实施问题 . 现在我想将一个对象注入 CustomMiddleware
,并且 same 对象作用域 per request 必须由请求管道中的 TestController
解析,但是我在同一请求的 CustomMiddleware
和 TestController
中看到了对象的不同实例已解析 .
public class InjectedObject
{
public string Instance = Guid.NewGuid().ToString();
}
public class CustomMiddleware
{
private readonly InjectedObject _obj;
public CustomMiddleware(InjectedObject obj)
{
_obj = obj;
}
public async Task Invoke(IOwinContext context, Func<Task> next)
{
//Do stuff with my object
await next();
}
}
并在app配置方法中:
container.RegisterType<CustomMiddleware>(new HierarchicalLifetimeManager());
container.RegisterType<InjectedObject>(new HierarchicalLifetimeManager());
app.Use(async (context, next) =>
{
var middleware = container.Resolve<CustomMiddleware>();
await middleware.Invoke(context, next);
});
当调用控制器时,InjectedObject与注入CustomMiddleware的不同 .
public class TestController : ApiController
{
private readonly InjectedObject _obj;
public TestController(InjectedObject obj)
{
_obj = obj;
}
}
有任何想法吗?