这几天在学习Asp.Net 5,现在文档以及博客之类的资料实在太少了,不看源码几乎举步维艰,好在全都是开源的,看看微软的代码也获益良多。
看到DependencyInjection的代码里除了默认的容器之外,还提供了对NInject, Castle, Unity, AutoFac等第三方IoC容器的支持,但看了半天愣是没找到怎么使用。连翻代码带查资料,好不容易才搞明白了。
在Microsoft.AspNet.Hosting.HostingEngine的EnsureApplicationServices方法里,会调用Startup.ConfigureServices方法,并接收其返回值,在默认生成的Asp.Net项目里,这个方法的返回值类型是void,但是实际上这个返回值类型可以是IServiceProvider类型。如果返回的不是IServiceProvider,则会创建一个默认的IServiceProvider实例,即默认的ServiceProvider类型;如果返回的是IServiceProvider类型,则将这个实例作为程序的IoC对外接口。
所以问题简单了,使用自定义容器实际上就是在ConfigureServices方法里返回一个实现了IServiceProvider类型的对象,而微软已经为我们封装了好几个了。不过目前貌似除了AutoFac,其它的还只支持普通的Framework。
代码如下
public IServiceProvider ConfigureServices(IServiceCollection services)
{
services.Configure<AppSettings>(Configuration.GetSubKey("AppSettings"));
services.AddMvc();
var builder = new ContainerBuilder();
AutofacRegistration.Populate(builder, services);
var container = builder.Build();
return container.Resolve<IServiceProvider>();
}