Dependency injection 在Asp.net Web Api2中使用Microsoft.Extension.DependencyInjection

Dependency injection 在Asp.net Web Api2中使用Microsoft.Extension.DependencyInjection,dependency-injection,asp.net-web-api2,Dependency Injection,Asp.net Web Api2,我正在尝试实现Asp.NETWebAPI项目,该项目依赖于第三方框架,该框架使用Asp.NETCore中不存在的HttpContext.Current进行大量工作。这就是为什么我无法创建针对.net完整框架的Asp.net核心Web应用程序 因此,我创建了带有WebApi扩展的老式Asp.net Web应用程序项目 现在我正在尝试使用Microsoft.Extension.DependencyInjection框架 我找到了Asp.NETMVC4的例子,但我的项目是WebApi。这种方法没有奏效

我正在尝试实现Asp.NETWebAPI项目,该项目依赖于第三方框架,该框架使用Asp.NETCore中不存在的HttpContext.Current进行大量工作。这就是为什么我无法创建针对.net完整框架的Asp.net核心Web应用程序

因此,我创建了带有WebApi扩展的老式Asp.net Web应用程序项目

现在我正在尝试使用Microsoft.Extension.DependencyInjection框架

我找到了Asp.NETMVC4的例子,但我的项目是WebApi。这种方法没有奏效。有人能提供链接或代码片段让我继续前进吗

注:当提供一个例子时,请确保它不应该使用OWIN框架。因为当我尝试使用OWIN管道时,第三方库(封闭源代码)无法正常工作。

我不久前也发现了这个示例,我使它在这两个方面都能完美工作 Net Mvc4和WebApi2项目

为WebApi项目使用一些IoC容器(例如Unity、Autofac),最重要的是实现接口IDependencyResolver,以创建您自己的依赖项解析器

这是我为WebApi项目编写的代码片段

WebApiConfig

公共静态类WebApiConfig
{
公共静态无效寄存器(HttpConfiguration配置)
{
...
//在此处使用Microsoft.Extension.DependencyInjection。
Bootstrapper(配置);
}
}
启动

公共类启动
{
公共静态无效引导程序(HttpConfiguration配置)
{
var provider=Configuration();
var解析器=新的DefaultDependencyResolver(提供程序);
config.dependencyrolver=解析程序;
}
专用静态IServiceProvider配置()
{
var services=newservicecolection();
services.addControllerAsservices(typeof(Startup).Assembly.GetExportedTypes()
.Where(t=>!t.isastract&!t.IsGenericTypeDefinition)
其中(t=>typeof(IHttpController).IsAssignableFrom(t)
||t.Name.EndsWith(“Controller”,StringComparison.OrdinalIgnoreCase));
var serviceProvider=services.BuildServiceProvider();
返回服务提供商;
}
}
DefaultDependencyResolver

公共类DefaultDependencyResolver:IDependencyResolver
{
专用IServiceScope服务范围;
受保护的IServiceProvider服务提供程序{get;set;}
public DefaultDependencyResolver(IServiceProvider服务提供程序)
{
this.ServiceProvider=ServiceProvider;
}
公共对象GetService(类型serviceType)
{
返回此.ServiceProvider.GetService(serviceType);
}
公共IEnumerable GetServices(类型serviceType)
{
返回此.ServiceProvider.GetServices(serviceType);
}
公共IDependencyScope BeginScope()
{
serviceScope=this.ServiceProvider.CreateScope();
返回新的DefaultDependencyResolver(serviceScope.ServiceProvider);
}
公共空间处置()
{
//您可以在使用.net core 2.0时实现此接口
//this.ServiceProvider.Dispose();
//需要以其他方式处理该范围
//你会有内存泄漏
serviceScope?.Dispose();
}
}
ServiceProviderExtensions

公共静态类服务提供扩展
{
公共静态IServiceCollection AddControllerAsseServices(此IServiceCollection services,
IEnumerable controllerTypes)
{
foreach(controllerTypes中的变量类型)
{
服务。AddTransient(类型);
}
返回服务;
}
}

感谢您提供的解决方案。我确认的时间有点晚了。这很好,也很有效,但有一个小建议:不清楚是否需要将任何要注入控制器构造函数的实例/类型添加到服务集合中。从我有限的测试来看,解析程序似乎需要“注入者”和“注入者”作为服务添加。非常好的答案@Hin Liang