Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Microsoft.Extensions.DependencyInjection在.net framework的webapi中注入依赖项?_C#_.net_Dependency Injection - Fatal编程技术网

C# 如何使用Microsoft.Extensions.DependencyInjection在.net framework的webapi中注入依赖项?

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

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

这对MVCWeb应用程序非常有效,但在webapi项目中失败,出现“无参数构造函数丢失”错误

如何在框架中仅使用默认程序集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;
    }
}

您是否在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);
}