C# 如何使用Microsoft.Extensions.DependencyInjection在.net framework的webapi中注入依赖项?
我正试图按照以下说明将记录器作为依赖项注入.Net Framework 4.7.2 web api项目中: 这对MVCWeb应用程序非常有效,但在webapi项目中失败,出现“无参数构造函数丢失”错误 如何在框架中仅使用默认程序集Microsoft.Extensions.DependencyInjection成功注入C# 如何使用Microsoft.Extensions.DependencyInjection在.net framework的webapi中注入依赖项?,c#,.net,dependency-injection,C#,.net,Dependency Injection,我正试图按照以下说明将记录器作为依赖项注入.Net Framework 4.7.2 web api项目中: 这对MVCWeb应用程序非常有效,但在webapi项目中失败,出现“无参数构造函数丢失”错误 如何在框架中仅使用默认程序集Microsoft.Extensions.DependencyInjection成功注入 public class Startup { public void Configuration(IAppBuilder app) { var
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;
}
}
您是否在HomeController上使用
[Serializable]
?如果是这样,当使用它时,您需要一个没有参数的构造函数
尝试添加以下内容:public HomeController(){}
,然后再次运行
更多信息:注册说明
一个问题是,您正在使用MVC解析器注册API注册DependencyResolver,不幸的是,您想要做的是:
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);
}
还请注意,idependencysolver
接口,因此您的defaultdependencysolver
类需要更新以从中派生
该接口上的一个变化是有一个BeginScope
API。要实现这一点,请在Microsoft.Extensions.DependencyInjection中调用IServiceProvider上的exposed以获取新的作用域。然后将提供程序从该范围传递到DefaultDependencyResolver的新实例
public idependencycoscope BeginScope()
{
返回新的DefaultDependencyResolver(this.serviceProvider.CreateScope().serviceProvider);
}
完整示例
您在MVC上的博客示例是使用OWIN。当我开始制作一个完整的示例时,我遇到了与您相同的错误,这是因为我没有正确配置OWIN,所以从未调用Startup。以下是Microsoft.Extensions.DependencyInjection用于注入MVC和WebAPI控制器的完整工作示例:
现在查看您在哪里向服务集合注册
IMyInterface
。您也没有注册web api的依赖项解析请查看更新的代码。您能否解释一下“您也没有注册web api的依赖项解析”的更多信息?如何/在何处执行此操作?不。但是,如果我添加了public HomeController(){},则我的记录器没有在构造函数中配置/注入。谢谢,这很有帮助。虽然,我似乎没有得到任何不同的结果与上述。它仍然期望控制器上的无参数构造函数。需要在BeginScope()中配置的任何内容?(预期使用System.Web.Http.Dependencies.IDependencyResolver实现)public IDependencyScope BeginScope(){抛出新的NotImplementedException();}@user8808262我添加了关于实现BeginScope()的说明。请查看,如果您还有其他问题,请告诉我。@RyanY,谢谢。我添加CreateScope是为了按照您上面的建议获得新范围,但运气不好。仍然获取无参数构造函数缺少错误。你还有什么进一步的想法吗?谢谢如果你有这样做的代码,你介意在这里分享吗?也许,这会对我有所帮助。Thanks@user8808262在我的答案中添加了一个完整的例子,希望这有帮助!非常感谢你!这是一个巨大的帮助!我很感激。
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);
}