【问题标题】:Simple Injector works without BeginExecutionContextScope, Web Api and OWINSimple Injector 无需 BeginExecutionContextScope、Web Api 和 OWIN 即可工作
【发布时间】:2015-08-06 17:51:52
【问题描述】:

我有一个控制台应用程序,它使用 Simple Injector 托管 WebApi(OWIN) 项目,根据documentation,我必须添加几行代码才能使其工作。

但在我的情况下,即使没有该配置,它也可以工作,所以问题是: 我做错了什么以及为什么会起作用?

对我来说有两种选择: 我的事情是最近修复了一些东西并且文档不是最新的 或者 其实我做错了,以后可能会出很多问题。

这是我的代码:

class Program
{
    static void Main(string[] args)
    {
        var disposable = WebApp.Start<Startup>("http://localhost:8085");

        Console.WriteLine("Server Started; Press enter to Quit");
        Console.ReadLine();
    }
}

public class Startup
{
    // This method is required by Katana:
    public void Configuration(IAppBuilder app)
    {
        var container = new Container();

        //app.Use(async (context, next) => {
        //    using (container.BeginExecutionContextScope())
        //    {
        //        await next();
        //    }
        //});

        container.RegisterWebApiRequest<ITestRepo, TestRepo>();

        //container.RegisterWebApiControllers(GlobalConfiguration.Configuration);

        container.Verify();

        var config = ConfigureWebApi();

        config.DependencyResolver =
          new SimpleInjectorWebApiDependencyResolver(container);

        //WebApiConfig.Register(config);
        app.UseWebApi(config);
    }

    private HttpConfiguration ConfigureWebApi()
    {
        var config = new HttpConfiguration();
        HttpRouteCollectionExtensions.MapHttpRoute(config.Routes, "DefaultApi", "api/{controller}/{id}", new { id = RouteParameter.Optional });
        return config;
    }

控制器:

public class CompaniesController : ApiController
{
    private readonly ITestRepo _repo;

    public CompaniesController(ITestRepo repo)
    {
        _repo = repo;//i get it here...
    }
}

它可以正常工作吗 谢谢 伊霍尔

【问题讨论】:

    标签: c# asp.net-web-api2 owin simple-injector


    【解决方案1】:

    Simple Injector 的 SimpleInjectorWebApiDependencyResolver 将确保在 Web API 管道调用 IDependencyResolver.BeginScope 时启动执行上下文范围。这确保 ApiController 在作用域内被解析,并允许解析和注入作用域实例。

    但是,在 OWIN 中集成 Web API 时,您经常会发现自己希望在执行 Web API 控制器之前或之后执行 OWIN 管道中的某些逻辑。但由于此代码在 Web API 管道之前或之后运行,因此此时没有活动范围。

    如果您需要运行需要作用域实例的逻辑,则需要使用注释掉的 app.Use(async (context, next) 调用显式启动执行上下文作用域。

    从 Simple Injector v2.8 开始,SimpleInjectorWebApiDependencyResolver 将确保在调用 IDependencyResolver.BeginScope 时它已经在现有执行上下文范围的上下文中运行(例如,因为您在 OWIN 管道中启动了一个范围) ,它不会自己启动一个新的作用域,而是重用现有的作用域。这样可以确保每个请求只创建一次所有作用域实例(这是您通常想要的)。

    长话短说,你所做的总是有效的;您只需要在解析 OWIN 管道中的实例时显式注册执行上下文范围。改变的是现在 Web API 确保它不会运行自己的范围,这通常更方便。

    【讨论】:

    • 这就是我想知道并在整个互联网上寻找的东西!感谢您的帮助!
    • 有时事情没有描述,但仍然有效; -)。
    猜你喜欢
    • 2015-03-29
    • 2016-09-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-01
    • 1970-01-01
    • 2016-05-10
    • 2014-03-21
    相关资源
    最近更新 更多