gpt4 book ai didi

c# - 简单注入(inject)器无需 BeginExecutionContextScope、Web Api 和 OWIN 即可工作

转载 作者:行者123 更新时间:2023-11-30 21:55:51 25 4
gpt4 key购买 nike

我有一个控制台应用程序,它使用简单注入(inject)器托管 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;
}

Controller :

public class CompaniesController : ApiController
{
private readonly ITestRepo _repo;

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

它可以工作吗谢谢伊尔

最佳答案

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

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

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

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

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

关于c# - 简单注入(inject)器无需 BeginExecutionContextScope、Web Api 和 OWIN 即可工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31862553/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com