一、前言
autofac是.net领域最为流行的ioc框架之一,微软的orchad开源程序使用的就是autofac,nopcommerce开源程序也是用的autofac。
orchad和nopcommerce在用autofac的时候进行封装,看过源码的都知道autafac使用简单,功能强大。
建议下载orchad和nopcommerce学习下源码:附上下载地址
和其他ioc对比:
unity:微软patterns&practicest团队开发的ioc依赖注入框架,支持aop横切关注点。
mef(managed extensibility framework):是一个用来扩展.net应用程序的框架,可开发插件系统。
spring.net:依赖注入、面向方面编程(aop)、数据访问抽象,、以及asp.net集成。
postsharp:实现静态aop横切关注点,使用简单,功能强大,对目标拦截的方法无需任何改动。
autofac:最流行的依赖注入和ioc框架,轻量且高性能,对项目代码几乎无任何侵入性。
下面介绍autofac的使用
二、autofac使用
新建一个mvc的项目,使用nuget安装autofac,需要安装autofac和autofac asp.net mvc5 intergration

安装完成后引用里面就多了autofac.dll和autofac.intergration.mvc,如果是在webapi里使用autofac需要安装autofac asp.net web api2.2 intergration 才可以。
新建一个person实体类
public class person
{
public int id { get; set; }
public string name { get; set; }
public int age { get; set; }
public string address { get; set; }
}
新建一个person仓储接口
public interface ipersonrepository
{
ienumerable getall();
person get(int id);
person add(person item);
bool update(person item);
bool delete(int id);
}
新建实现
public class personrepository : ipersonrepository
{
list person = new list();
public personrepository()
{
add(new person { id = 1, name = "joye.net1", age = 18, address = "中国上海" });
add(new person { id = 2, name = "joye.net2", age = 18, address = "中国上海" });
add(new person { id = 3, name = "joye.net3", age = 18, address = "中国上海" });
}
public ienumerable getall()
{
return person;
}
public person get(int id)
{
return person.find(p => p.id == id);
}
public person add(person item)
{
if (item == null)
{
throw new argumentnullexception("item");
}
person.add(item);
return item;
}
public bool update(person item)
{
if (item == null)
{
throw new argumentnullexception("item");
}
int index = person.findindex(p => p.id == item.id);
if (index == -1)
{
return false;
}
person.removeat(index);
person.add(item);
return true;
}
public bool delete(int id)
{
person.removeall(p => p.id == id);
return true;
}
}
global属性注入
public class mvcapplication : system.web.httpapplication
{
private void setupresolverules(containerbuilder builder)
{
builder.registertype().as();
}
protected void application_start()
{
var builder = new containerbuilder();
setupresolverules(builder);
builder.registercontrollers(assembly.getexecutingassembly()).propertiesautowired();
var container = builder.build();
dependencyresolver.setresolver(new autofacdependencyresolver(container));
arearegistration.registerallareas();
filterconfig.registerglobalfilters(globalfilters.filters);
routeconfig.registerroutes(routetable.routes);
bundleconfig.registerbundles(bundletable.bundles);
}
}
最好获取数据结果;

三、总结
文中只是给出了一个简单的注入实现,剩下的可以自己去研究下,构造函数注入,方法注入
泛型注入,所有程序集注入,都可以看下,
也可以把文章开头的两个开源的项目下载下来研究里面的autofac注入方式。
电脑城出口基地
