gpt4 book ai didi

c# - 如何使用 Microsoft.Extensions.DependencyInjection 在 .net 框架中的 webapi 中注入(inject)依赖项?

转载 作者:行者123 更新时间:2023-12-05 02:10:45 30 4
gpt4 key购买 nike

我正在尝试按照以下说明将我的记录器作为依赖项注入(inject) .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 项目上失败并出现“缺少无参数构造函数”错误。

如何在框架中仅使用默认程序集成功注入(inject):Microsoft.Extensions.DependencyInjection

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

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

private IMyInterface _my;
public HomeController(IMyInterface my)
{
_my= my;
}

最佳答案

注册说明

一个问题是您正在使用 MVC 解析器注册 API 注册您的 DependencyResolver,不幸的是 is different from the WebAPI resolver registration 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);
}

还要注意 IDependencyResolver 接口(interface) is defined separately in System.Web.Http ,因此您的 DefaultDependencyResolver 类需要更新为从它派生。

该接口(interface)的一个变化是有一个 BeginScope API。要实现它,请调用 CreateScope Extension Method在 Microsoft.Extensions.DependencyInjection 中的 IServiceProvider 上公开以获得新范围。然后将提供程序从该范围传递到您的 DefaultDependencyResolver 的新实例。

    public IDependencyScope BeginScope()
{
return new DefaultDependencyResolver(this.serviceProvider.CreateScope().ServiceProvider);
}

完整示例

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

https://github.com/ryandle/MVC_WebApi_DI_Example

关于c# - 如何使用 Microsoft.Extensions.DependencyInjection 在 .net 框架中的 webapi 中注入(inject)依赖项?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58272312/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com