【问题标题】:Injecting a dependency into OWIN Middleware and per web-request with Simple Injector使用 Simple Injector 将依赖项注入 OWIN 中间件并根据 Web 请求
【发布时间】:2016-05-16 04:03:47
【问题描述】:

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

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

显然,这不起作用:

container.Options.DefaultScopedLifestyle = new WebApiRequestLifestyle();

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

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

我尝试了混合生活方式,但这也不起作用,因为我认为中间件在技术上不属于“范围”生活方式。我想它可能更接近单身人士。

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

【问题讨论】:

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


    【解决方案1】:

    documentation 显示了如何在作用域中包装 OWIN 请求的示例:

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

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

    container.Options.DefaultScopedLifestyle = new AsyncScopedLifestyle();
    

    【讨论】:

    • 哇,简单。我没有很好地阅读文档。非常感谢!
    • 如果我想在中间件和任何 API 控制器中使用相同的实例怎么办?这种方法的问题是 - 它在中间件中注入了一个单例实例,并在 API 控制器中注入了 webapi 范围内的实例
    猜你喜欢
    • 2016-09-01
    • 1970-01-01
    • 2017-06-18
    • 2015-04-02
    • 2013-04-01
    • 2015-11-04
    • 2015-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多