IOC 控制反转容器 autofac
IOC概念:当我们写程序 所有对象都是手动new的,当项目大了的坏处:
1>各模块之间耦合严重
2>想要更换其他实现类很麻烦
3>有的程序员只关心"该我一个实现**接口的类",他不关心如何来的
IOC 使用框架实现new对象 使用方法:实现类的接口 IUserBll ubll=new IUserBll(); ubll.方法();
IOC容器有很多 Spring.NET Unity Castls Autofac Autofac最火
Autofac基本使用:
1)创建 接口类库 ,实现类库 ,并添加引用
用户接口:
public interface IUserBll
{
//检查
bool Check(string username, string pwd);
//添加
void AddNew(string p1, string p2);
}
狗儿接口:
public interface IDogBll
{
//狗叫
void Bark();
}
用户实现类:
public class UserBll : IUserBll
{
public bool Check(string username, string pwd)
{
Console.WriteLine("检查登录, username=" + username);
return true;
}
public void AddNaew(string username, string pwd)
{
Console.WriteLine("新增用户, username="+username);
}
}
狗儿实现类:
public void Bark()
{
Console.WriteLine("汪汪汪~~~");
}
2) 安装程插件:install-package autofac
3)创建一个容器
ContainerBuilder builder = new ContainerBuilder();
4)注册实现类Service1请求IService接口,同时返回Service1对象 Service1类是IService1接口的实现类
把UserBll注册为IUserBll的实现类
builder.RegisterType<UserBll>().As<IUserBll>(); //等同于下面
builder.RegisterType<UserBll>().AsImplementedInterfaces(); //表示UserBll的所有接口都实现
builder.RegisterType<DogBll>().AsImplementedInterfaces();
当类库很多 我们无法知晓那些类库接口还没有被实现
为了解决这个问题,我们简化代码
//获取所有类Assembly asm=Assembly.Load("当前项目名称") ;并注册为实现类
Assembly asm = Assembly.Load("Pro");
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();
IContainer resolver = builder.Build();
//创建IUserBll实现类的对象 bll
IUserBll bll = resolver.Resolve<IUserBll>();
bll.AddNew("aa", "123");
IDogBll dbll = resolver.Resolve<IDogBll>();
dbll.Bark();
//假设IUser接口被多个类实现 获取类的方法:
IEnumerable<IUserBll> blls = resolver.Resolve < IEnumerable<IUserBll>>();
foreach (IUserBll userbll in blls)
{
Console.WriteLine(userbll.GetType());
userbll.AddNew("测试", "11");
}
//属性注入:(只有被Autofac创建的对象才会被--属性自动注入)
//如果一个接口实现类中调用另一个接口实现类 需要在这个类中声明调用类的属性
//既: public IDogBll DogBll{get;set}即可
//使用时全部注册后面加.PropertiesAutowired();即可
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();
//Autofac 生命周期
//1>PerDependency 每次请求Resovle 都返回一个新对象: PerDependency();
//2>SingleInstance 单列 每次返或同一个对象: SingleInstance()
//3>PerLifetimeScope 每个生命周期一个对象
//4>InstancePreRequest Asp.Mvc专用 每个请求一个对象
//建议最好配置 成无状态的(无状态既实现类中不要有成员比变量),使用单例方式最好.