简单注入器在没有 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 确保它不会 运行 自己的范围,这通常更方便。
我有一个控制台应用程序,它使用 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 确保它不会 运行 自己的范围,这通常更方便。