我试图在Asp.NET WebApi中根据请求构建一些由Unity解决的OWIN中间件。 (不是DotNetCore!)
问题#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
来解决这个问题,但这感觉不对。当然有一种方法可以正常工作吗?
问题#2:
如前所述,我已经回避了OwinMiddleware
实施问题。现在我想将一个对象注入CustomMiddleware
,并且相同的对象范围每个请求必须由请求管道中的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;
}
}
有什么想法吗?