简介:Autofac是一个.net下非常优秀,性能非常好的IOC容器(.net下效率最高的容器)
1.nuget 引用
2.创建两个类库项目,IService (用于编写接口),ServiceImpl(用于创建实现类)
public class IService
{ public interface IAnimalBark { void Bark(); } public interface IAnimalSleep { void Sleep(); }public interface IUser
{ void AddNew(string name, string pwd); }public interface ISchool
{ void AfterSchool(); }}
实现类
public class ServiceImpl :IService
{ public class Cat : IAnimalBark { public void Bark() { Console.WriteLine("喵喵喵"); } } public class Dog : IAnimalBark, IAnimalSleep { public void Bark() { Console.WriteLine("汪汪汪汪汪"); }public void Sleep()
{ Console.WriteLine("zZ,睡着了"); } } public class User : IUser { public void AddNew(string name, string pwd) { Console.WriteLine("添加新的用户:" + name); } }public class School : ISchool
{ public IAnimalBark Dog { get; set; } public void AfterSchool() { Dog.Bark(); Console.WriteLine("放学了"); } } }
//1.单个注册
//ContainerBuilder builder = new ContainerBuilder(); 注册实现类Dog,当我们 请求IAnimalBark接口 的时候返回的是类Dog的对象,原理性的代码 //builder.RegisterType<Dog>().As<IAnimalBark>(); //IContainer container = builder.Build(); 请求接口 //IAnimalBark bark = container.Resolve<IAnimalBark>();//解析 //bark.Bark(); //Console.ReadKey(); //2.多个注册 直接可以注册程序集名称//ContainerBuilder builder = new ContainerBuilder(); //容器
//var atype = typeof(ServiceImpl); // string namespacea=atype.Assembly.ToString(); //Assembly asm = Assembly.Load(namespacea);//实现类所在的程序集名称 //builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();//常用 //IContainer container = builder.Build(); //IAnimalBark bark = container.Resolve<IAnimalBark>(); //IUser user = container.Resolve<IUser>(); //bark.Bark(); //user.AddNew("B1111","123");//3..如果有多个实现类,container.Resolve<IAnimalBark>();只会返回其中一个对象
//,如果想返回多个类的对象,应改成container.Resolve<IEnumerable<IAnimalBark>>();//ContainerBuilder builder = new ContainerBuilder(); //容器
//var atype = typeof(ServiceImpl); //string namespacea = atype.Assembly.ToString(); //Assembly asm = Assembly.Load(namespacea);//实现类所在的程序集名称 //builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();//常用 //IContainer container = builder.Build(); 返回一个接口 //IEnumerable<IAnimalBark> animals = container.Resolve<IEnumerable<IAnimalBark>>(); //foreach (var a in animals) { // a.Bark(); } //4.如果一个实现类中定义了其他类型的属性(接口类型的属性),在注册时又加上builder.RegisterAssemblyType // s(asm).AsImplementedInterfaces().PropertiesAutowired(); 这样会给属性进行“注入”ContainerBuilder builder = new ContainerBuilder(); //容器
var atype = typeof(ServiceImpl); string namespacea = atype.Assembly.ToString(); Assembly asm = Assembly.Load(namespacea);//实现类所在的程序集名称 builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces().PropertiesAutowired();//常用 允许属性写入 IContainer container = builder.Build(); //返回一个接口 ISchool school = container.Resolve<ISchool>(); school.AfterSchool(); //如果一个接口 有多个实现方法,调用会以最后一个实现的方法为准//自定义生命周期
//SingleInstance 每次resolve返回同一个对象 InstancePerDependency每次返回新的实例