我正在尝试构建一些OWIN中间件,这些中间件由Unity在Asp.NET WebApi中按请求解决 . (不是DotNetCore!)

Problem #1: 我无法弄清楚如何将 next 传递给 OwinMiddleware 实现的构造函数 . 此代码将无法编译,因为 nextFunc<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 解析,但是我在同一请求的 CustomMiddlewareTestController 中看到了对象的不同实例已解析 .

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;
    }
}

有任何想法吗?