使用 Simple Injector 将依赖项注入 OWIN 中间件和每个 Web 请求
Injecting a dependency into OWIN Middleware and per web-request with 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>();
};
我尝试了混合生活方式,但这也没有用,因为我认为中间件在技术上不属于 "scoped" 生活方式。我认为它可能更接近单例。
是否有更好的方法来设计我的应用程序以避免此问题或通过某种自定义范围的生活方式来解决它?
documentation 显示了如何在范围内包装 OWIN 请求的示例:
public void Configuration(IAppBuilder app) {
app.Use(async (context, next) => {
using (AsyncScopedLifedtyle.BeginScope (container)) {
await next();
}
});
}
这样做是将 OWIN 请求包装在执行上下文范围内。您现在要做的就是将执行竞赛范围设为默认范围生活方式,如下所示:
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
我正在尝试找出如何最好地将所有依赖项注入我为 Web API 应用程序编写的自定义 OWIN 中间件。一个简单的例子就是我正在使用的 DbContext。我有一些中间件需要根据请求进行潜在查询。我遇到的问题是我希望我的 DbContext 具有 WebApiRequestLifestyle 范围。我的 DbContext 是这样注册的:
container.Register<MobileDbContext>(Lifestyle.Scoped);
显然,这不起作用:
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
因为我需要在我的中间件中使用 MobileDbContext,使用类似的东西:
app.CreatePerOwinContext(() =>
{
return container.GetInstance<MobileDbContext>();
};
我尝试了混合生活方式,但这也没有用,因为我认为中间件在技术上不属于 "scoped" 生活方式。我认为它可能更接近单例。
是否有更好的方法来设计我的应用程序以避免此问题或通过某种自定义范围的生活方式来解决它?
documentation 显示了如何在范围内包装 OWIN 请求的示例:
public void Configuration(IAppBuilder app) {
app.Use(async (context, next) => {
using (AsyncScopedLifedtyle.BeginScope (container)) {
await next();
}
});
}
这样做是将 OWIN 请求包装在执行上下文范围内。您现在要做的就是将执行竞赛范围设为默认范围生活方式,如下所示:
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();