使用Simple Injector将依赖项注入OWIN Middleware和每个Web请求

时间:2016-05-16 04:03:47

标签: c# entity-framework asp.net-web-api dependency-injection simple-injector

我正在尝试找出如何最好地将所有依赖项注入我为Web API应用程序编写的自定义OWIN中间件。一个简单的例子就是我正在使用的DbContext。我有一些中间件需要根据请求进行潜在查询。我遇到的问题是我希望我的DbContext具有WebApiRequestLifestyle范围。我的DbContext注册如下:

container.Register<MobileDbContext>(Lifestyle.Scoped);

显然,这不起作用:

container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();

因为我需要在我的中间件中使用MobileDbContext:

app.CreatePerOwinContext(() =>
{
    return container.GetInstance<MobileDbContext>();
};

我尝试过一种混合的生活方式,但这也没有用,因为我不认为中间件在技术上属于可以属于&#34;范围的&#34;生活方式。我想,它可能更接近单身人士。

有没有更好的方法来设计我的应用程序以避免此问题或通过某种自定义范围的生活方式解决它?

1 个答案:

答案 0 :(得分:3)

documentation显示了如何在范围中包装OWIN请求的示例:

public void Configuration(IAppBuilder app) {
    app.Use(async (context, next) => {
        using (AsyncScopedLifedtyle.BeginScope (container)) {
            await next();
        }
    });
}

这样做是在执行上下文范围中包装OWIN请求。您现在要做的就是将执行竞赛范围设为默认的范围生活方式,如下所示:

container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();