在 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;
    }
}