组件 Autofac 实现接口类工具

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专用 每个请求一个对象
//建议最好配置 成无状态的(无状态既实现类中不要有成员比变量),使用单例方式最好.

原文地址:https://www.cnblogs.com/x666066/p/10241681.html