在 Asp.net Web Api2 中使用 Microsoft.Extension.DependencyInjection
Using Microsoft.Extension.DependencyInjection in Asp.net Web Api2
我正在尝试实施 Asp.Net webApi 项目,该项目依赖于第三方框架,该框架使用 HttpContext.Current 做很多事情,而 Asp.net Core 中不存在。这就是为什么我无法创建 Asp.net 以 .net 完整框架为目标的核心 Web 应用程序。
所以我创建了带有 WebApi 扩展的老式 Asp.net Web 应用程序项目。
现在我正在尝试使用 Microsoft.Extension.DependencyInjection 框架。
我找到了 this Asp.Net Mvc4 的示例,但我的项目是 WebApi。这种方法没有用。谁能提供 link 或代码片段让我继续前进?
P.S: 提供示例时,请确保它不应该使用 OWIN 框架。因为当我尝试使用OWIN管道时,第三方库(闭源)无法正常工作。
我刚才也找到了 that 例子,我让它在
Asp.Net Mvc4 和 WebApi2 项目。
为WebApi项目使用一些IoC容器(例如Unity,Autofac),最重要的是实现接口IDependencyResolver来制作你自己的依赖解析器。
她是我的 WebApi 项目代码片段。
WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
// using Microsoft.Extension.DependencyInjection here.
Startup.Bootstrapper(config);
}
}
启动
public class Startup
{
public static void Bootstrapper(HttpConfiguration config)
{
var provider = Configuration();
var resolver = new DefaultDependencyResolver(provider);
config.DependencyResolver = resolver;
}
private static IServiceProvider Configuration()
{
var services = new ServiceCollection();
services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
.Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
.Where(t => typeof(IHttpController).IsAssignableFrom(t)
|| t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
}
DefaultDependencyResolver
public class DefaultDependencyResolver : IDependencyResolver
{
private IServiceScope serviceScope;
protected IServiceProvider ServiceProvider { get; set; }
public DefaultDependencyResolver(IServiceProvider serviceProvider)
{
this.ServiceProvider = serviceProvider;
}
public object GetService(Type serviceType)
{
return this.ServiceProvider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return this.ServiceProvider.GetServices(serviceType);
}
public IDependencyScope BeginScope()
{
serviceScope = this.ServiceProvider.CreateScope();
return new DefaultDependencyResolver(serviceScope.ServiceProvider);
}
public void Dispose()
{
// you can implement this interface just when you use .net core 2.0
// this.ServiceProvider.Dispose();
//need to dispose the scope otherwise
//you'll get a memory leak
serviceScope?.Dispose();
}
}
ServiceProviderExtensions
public static class ServiceProviderExtensions
{
public static IServiceCollection AddControllersAsServices(this IServiceCollection services,
IEnumerable<Type> controllerTypes)
{
foreach (var type in controllerTypes)
{
services.AddTransient(type);
}
return services;
}
}
我正在尝试实施 Asp.Net webApi 项目,该项目依赖于第三方框架,该框架使用 HttpContext.Current 做很多事情,而 Asp.net Core 中不存在。这就是为什么我无法创建 Asp.net 以 .net 完整框架为目标的核心 Web 应用程序。
所以我创建了带有 WebApi 扩展的老式 Asp.net Web 应用程序项目。
现在我正在尝试使用 Microsoft.Extension.DependencyInjection 框架。
我找到了 this Asp.Net Mvc4 的示例,但我的项目是 WebApi。这种方法没有用。谁能提供 link 或代码片段让我继续前进?
P.S: 提供示例时,请确保它不应该使用 OWIN 框架。因为当我尝试使用OWIN管道时,第三方库(闭源)无法正常工作。
我刚才也找到了 that 例子,我让它在 Asp.Net Mvc4 和 WebApi2 项目。
为WebApi项目使用一些IoC容器(例如Unity,Autofac),最重要的是实现接口IDependencyResolver来制作你自己的依赖解析器。
她是我的 WebApi 项目代码片段。
WebApiConfig
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
...
// using Microsoft.Extension.DependencyInjection here.
Startup.Bootstrapper(config);
}
}
启动
public class Startup
{
public static void Bootstrapper(HttpConfiguration config)
{
var provider = Configuration();
var resolver = new DefaultDependencyResolver(provider);
config.DependencyResolver = resolver;
}
private static IServiceProvider Configuration()
{
var services = new ServiceCollection();
services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
.Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
.Where(t => typeof(IHttpController).IsAssignableFrom(t)
|| t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
var serviceProvider = services.BuildServiceProvider();
return serviceProvider;
}
}
DefaultDependencyResolver
public class DefaultDependencyResolver : IDependencyResolver
{
private IServiceScope serviceScope;
protected IServiceProvider ServiceProvider { get; set; }
public DefaultDependencyResolver(IServiceProvider serviceProvider)
{
this.ServiceProvider = serviceProvider;
}
public object GetService(Type serviceType)
{
return this.ServiceProvider.GetService(serviceType);
}
public IEnumerable<object> GetServices(Type serviceType)
{
return this.ServiceProvider.GetServices(serviceType);
}
public IDependencyScope BeginScope()
{
serviceScope = this.ServiceProvider.CreateScope();
return new DefaultDependencyResolver(serviceScope.ServiceProvider);
}
public void Dispose()
{
// you can implement this interface just when you use .net core 2.0
// this.ServiceProvider.Dispose();
//need to dispose the scope otherwise
//you'll get a memory leak
serviceScope?.Dispose();
}
}
ServiceProviderExtensions
public static class ServiceProviderExtensions
{
public static IServiceCollection AddControllersAsServices(this IServiceCollection services,
IEnumerable<Type> controllerTypes)
{
foreach (var type in controllerTypes)
{
services.AddTransient(type);
}
return services;
}
}