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,因此很难找到有关此文档的文档。
更新以包括 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)
| 归档时间: |
|
| 查看次数: |
778 次 |
| 最近记录: |