简单注入器在没有 BeginExecutionContextScope、Web Api 和 OWIN 的情况下工作

Simple Injector works without BeginExecutionContextScope, Web Api and OWIN

我有一个控制台应用程序,它使用 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...
    }
}

可以吗 谢谢 伊霍尔

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

然而,在 OWIN 中集成 Web API 时,您经常会发现自己想要在执行 Web API 控制器之前或之后在 OWIN 管道中执行某些逻辑。但是因为此代码 运行s 在 Web API 管道之前或之后,所以此时没有活动范围。

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

自 Simple Injector v2.8 起,SimpleInjectorWebApiDependencyResolver 将确保在调用 IDependencyResolver.BeginScope 时它已经在现有执行上下文范围的上下文中 运行ning (因为例如你在 OWIN 管道中启动一个范围,它 不会 本身启动一个新的范围,而是重用现有的范围。这确保每个请求只创建一次所有范围内的实例(这是你通常想要的)。

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