IServiceCollection не найден в веб-API с MVC 6

Я работаю с веб-API с MVC 6, здесь я собираюсь внедрить репозиторий в контроллер, нам нужно зарегистрировать его с контейнером 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>();
        }
    }
}

Показывает ошибку...

Не удалось найти имя типа или пространства имен "IServiceCollection" (вам не хватает директивы using или ссылки на сборку?)

Ответ 1

Добавьте ссылку на пакет NuGet Microsoft.Extensions.DependencyInjection, а затем я рекомендую сделать то, что описано в этой ссылке.

Ответ 2

Я наткнулся на этот вопрос в поисках помощи с 4. 6+ (как, кажется, некоторые другие тоже искали) и создания DefaultDependencyResolver для полной совместимости с MVC 5, поэтому я надеюсь, что это поможет другим, которые могут сделать то же самое.

Первый ответ является правильным для этого вопроса, чтобы добавить "Microsoft.Extensions.DependencyInjection" (поскольку IServiceCollection является интерфейсом, определенным в этом пакете).

Если вы хотите использовать инфраструктуру "Microsoft.Extensions.DependencyInjection" с MVC5 или .NET Framework 4. 6+, вам необходимо создать собственный преобразователь зависимостей.

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

Затем вы можете просто обновить Application_Start вашего global.asax:

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

Примечание. Средство определения зависимостей было взято в основном из здесь.