在使用MVC 6的Web API中找不到IServiceCollection

时间:2016-05-10 06:55:39

标签: c# dependency-injection asp.net-core-mvc

我正在使用带有MVC 6的Web API,这里我是为了将存储库注入控制器,我们需要将其注册到DI容器。打开Startup.cs文件。

ConfigureServices方法中,添加突出显示的代码:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.Owin;
using Owin;
using TodoApi.Models;

[assembly: OwinStartup(typeof(TodoApi.Startup))]

namespace TodoApi
{
    public partial class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            ConfigureAuth(app);
        }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();
            // Add our repository type
            services.AddSingleton<ITodoRepository, TodoRepository>();
        }
    }
}

显示错误......

  

类型或命名空间名称&#39; IServiceCollection&#39;找不到(你错过了使用指令或汇编引用吗?)

2 个答案:

答案 0 :(得分:8)

添加对Microsoft.Extensions.DependencyInjection NuGet包的引用,然后我建议执行this链接中的说明。

答案 1 :(得分:0)

我偶然发现了这个问题,以寻求4.6+的帮助(似乎其他人也在寻找帮助),并创建了DefaultDependencyResolver以使其与MVC 5完全兼容,因此我希望这对其他可能做到这一点的人有所帮助。

第一个答案对于添加“ Microsoft.Extensions.DependencyInjection”的问题是正确的(因为IServiceCollection是该程序包中定义的接口)。

如果要在MVC5或.NET Framework 4.6+中使用“ Microsoft.Extensions.DependencyInjection”框架,则需要创建一个自定义的依赖关系解析器。

public class DefaultDependecyResolver : IDependencyResolver
{
    public IServiceProvider ServiceProvider { get; }

    public DefaultDependecyResolver(IServiceProvider serviceProvider)
        => this.ServiceProvider = serviceProvider;

    public IDependencyScope BeginScope() => this;

    public object GetService(Type serviceType)
        => this.ServiceProvider.GetService(serviceType);

    public IEnumerable<object> GetServices(Type serviceType)
        => this.ServiceProvider.GetServices(serviceType);

    public void Dispose() { }
}

然后,您可以创建所需的服务提供者和依赖关系解析器。您甚至可以将其包装到“ IocConfig”类中以遵循MVC5约定:

public static class IocConfig
{
    public static void Register(HttpConfiguration config)
    {
        var services = new ServiceCollection()
            .AddSingleton<ISearchService, SearchService>() // Add your dependencies
            .BuildServiceProvider();
        config.DependencyResolver = new DefaultDependecyResolver(services);
    }
}

然后,您只需更新global.asax的Application_Start

public class WebApiApplication : System.Web.HttpApplication
{
    protected void Application_Start()
    {
        GlobalConfiguration.Configure(WebApiConfig.Register);
        GlobalConfiguration.Configure(IocConfig.Register); // Added
    }
}

注意:依赖性解析器主要来自here