Ответ 1
Добавьте ссылку на пакет NuGet Microsoft.Extensions.DependencyInjection
, а затем я рекомендую сделать то, что описано в этой ссылке.
Я работаю с веб-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 или ссылки на сборку?)
Добавьте ссылку на пакет NuGet Microsoft.Extensions.DependencyInjection
, а затем я рекомендую сделать то, что описано в этой ссылке.
Я наткнулся на этот вопрос в поисках помощи с 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
}
}
Примечание. Средство определения зависимостей было взято в основном из здесь.