asp.net将ApiController添加为依赖项注入服务

als*_*9xd 5 c# asp.net asp.net-mvc dependency-injection asp.net-web-api

您好,我退出了本指南,将asp.net核心依赖注入集成到MVC 5中。最初,它使用默认控制器(从System.Web.Mvc.Controller类继承)可以正常工作。但是后来我希望注入的依赖项在从继承的控制器中可用System.Web.Http.ApiController。我有95%的把握是问题出在代码的这一部分,所有的控制器都作为服务添加了,因为我遇到的错误与指南中所说的相同,我会在没有该部分的情况下得到错误。

缺少的方法异常,说明您的构造函数未实现默认的无参数构造函数

启动文件

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

      return services;
   }
}

public partial class Startup
{
  public void ConfigureServices(IServiceCollection services){
    PackageScraperService pScraper = new PackageScraperService();
    services.addSington<IPackageScraper>(pScraper);

    // Problem Code

    services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
     .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
     .Where(t => typeof(IController).IsAssignableFrom(t) 
        || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
  }

  public void Configuration(IAppBuilder app){
      var services = new ServiceCollection();

      ConfigureServices(services)
      var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
      DependencyResolver.SetResolver(resolver);
  }
}
Run Code Online (Sandbox Code Playgroud)

我看了看结果

typeof(Startup).Assembly.GetExportedTypes()
     .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
     .Where(t => typeof(IController).IsAssignableFrom(t) 
        || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase))
Run Code Online (Sandbox Code Playgroud)

它似乎可以正确找到我的ApiController(ValuesController.cs)

我也将api控制器更改为从Controller类继承,并且工作正常。

有没有更简单的方法将控制器添加为服务?由于我使用MVC而不是Core,因此很难找到有关此文档的文档。

Nko*_*osi 7

更新以包括 ApiControllers

services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
     .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
     .Where(t => typeof(IController).IsAssignableFrom(t) 
        || typeof(IHttpController).IsAssignableFrom(t));
Run Code Online (Sandbox Code Playgroud)

您还需要为Web API全局配置设置依赖性解析器。

更新,DefaultDependencyResolver以便MVC和Web API都可以使用它。它们按名称共享接口,但它们属于不同的名称空间。

public class DefaultDependencyResolver :
    System.Web.Http.Dependencies.IDependencyResolver,
    System.Web.Mvc.IDependencyResolver {

    private readonly 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);
    }

    //Web API specific

    public System.Web.Http.Dependencies.IDependencyScope BeginScope() {
        return this;
    }

    public void Dispose() {
        // NO-OP, as the container is shared. 
    }
}
Run Code Online (Sandbox Code Playgroud)

并在启动时为MVC和Web API设置解析器。

public void Configuration(IAppBuilder app){
    var services = new ServiceCollection();    
    ConfigureServices(services);        
    var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
    DependencyResolver.SetResolver(resolver);//Set MVC
    GlobalConfiguration.Configuration.DependencyResolver = resolver; //Set for Web API
}
Run Code Online (Sandbox Code Playgroud)