我正在使用带有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;找不到(你错过了使用指令或汇编引用吗?)
答案 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。