在Asp.NET WebApi中使用Unity的每个请求的OWIN中间件和依赖注入

时间:2018-05-02 15:59:04

标签: c# asp.net-web-api dependency-injection owin unity-container

我试图在Asp.NET WebApi中根据请求构建一些由Unity解决的OWIN中间件。 (不是DotNetCore!)

问题#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来解决这个问题,但这感觉不对。当然有一种方法可以正常工作吗?

问题#2: 如前所述,我已经回避了OwinMiddleware实施问题。现在我想将一个对象注入CustomMiddleware,并且相同的对象范围每个请求必须由请求管道中的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;
    }
}

有什么想法吗?

0 个答案:

没有答案