使用Simple Injector向OWIN中间件和每个web请求注入依赖项



我正在努力找出如何将我的所有依赖项最好地注入到我为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();

最新更新