我正在努力找出如何将我的所有依赖项最好地注入到我为Web API应用程序编写的自定义OWIN中间件中。一个简单的例子是我正在使用的DbContext。我有一些中间件可能需要根据请求进行查询。我的问题是,我希望我的DbContext在其他方面具有WebApiRequestLifestyle作用域。我的DbContext是这样注册的:
container.Register<MobileDbContext>(Lifestyle.Scoped);
显然,这不起作用:
container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();
因为我需要在我的中间件中使用MobileDbContext,比如:
app.CreatePerOwinContext(() =>
{
return container.GetInstance<MobileDbContext>();
};
我尝试了一种混合的生活方式,但也没有奏效,因为我认为中间件在技术上不属于"范围"的生活方式。我认为,这可能更接近于单身。
有没有更好的方法来设计我的应用程序来避免这个问题,或者通过某种自定义范围的生活方式来解决这个问题?
文档展示了如何将OWIN请求包装在范围中的示例:
public void Configuration(IAppBuilder app) {
app.Use(async (context, next) => {
using (AsyncScopedLifedtyle.BeginScope (container)) {
await next();
}
});
}
这样做的目的是将OWIN请求封装在执行上下文范围中。您现在所要做的就是将执行竞赛范围作为默认范围的生活方式,如下所示:
container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();