如何使用 Microsoft.Extensions.DependencyInjection 在 .net 框架中的 webapi 中注入依赖项?

use*_*262 2 .net c# dependency-injection

我正在尝试按照以下说明将我的记录器作为 .Net Framework 4.7.2 web api 项目中的依赖项注入:

https://scottdorman.blog/2016/03/17/integrating-asp-net-core-dependency-injection-in-mvc-4/

这对 MVC Web 应用程序很有用,但在 webapi 项目上失败,并出现“无参数构造函数丢失”错误。

如何仅使用默认程序集成功注入:Microsoft.Extensions.DependencyInjection in framework?

public class Startup
{
    public void Configuration(IAppBuilder app)
    {

        var services = new ServiceCollection();
        ConfigureServices(services);
        var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
        DependencyResolver.SetResolver(resolver);
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
            .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
            .Where(t => typeof(IController).IsAssignableFrom(t)
                        || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
        services.AddSingleton<IMyInterface , MyClass>();
    }
}
public class DefaultDependencyResolver : IDependencyResolver
{
    protected IServiceProvider serviceProvider;

    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 static class ServiceProviderExtensions
{
    public static IServiceCollection AddControllersAsServices(this IServiceCollection services,
        IEnumerable<Type> controllerTypes)
    {
        foreach (var type in controllerTypes)
        {
            services.AddTransient(type);
        }

        return services;
    }
}
Run Code Online (Sandbox Code Playgroud)

通过这样的注入获取“缺少无参数构造函数”错误:

private IMyInterface _my;
public HomeController(IMyInterface my)
{
    _my= my;
}
Run Code Online (Sandbox Code Playgroud)

Rya*_*anY 5

注册说明

一个问题是您正在使用 MVC 解析器注册 API 注册 DependencyResolver,不幸的是,它与 WebAPI 解析器注册 API 不同。你想要做的是:

public void Configuration(IAppBuilder app)
{    
    var services = new ServiceCollection();
    ConfigureServices(services);
    var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
    HttpConfiguration config = new HttpConfiguration();
    config.DependencyResolver = resolver;
    app.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)

另请注意,该IDependencyResolver接口是在 System.Web.Http 中单独定义的,因此您的DefaultDependencyResolver类需要更新以从它派生。

该接口上发生变化的一件事是有一个BeginScopeAPI。要实现这一点,请调用Microsoft.Extensions.DependencyInjection 中公开的CreateScope 扩展方法IServiceProvider以获取新范围。然后将提供程序从该范围传递到您的 DefaultDependencyResolver 的新实例。

public void Configuration(IAppBuilder app)
{    
    var services = new ServiceCollection();
    ConfigureServices(services);
    var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
    HttpConfiguration config = new HttpConfiguration();
    config.DependencyResolver = resolver;
    app.UseWebApi(config);
}
Run Code Online (Sandbox Code Playgroud)

完整示例

您关注的 MVC 博客示例使用的是 OWIN。当我开始做一个完整的例子时,我遇到了和你一样的错误,这是因为我没有正确配置 OWIN,所以从未调用 Startup。这是用于注入 MVC 和 WebAPI 控制器的 Microsoft.Extensions.DependencyInjection 的完整工作示例:

https://github.com/ryandle/MVC_WebApi_DI_Example