欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Using AutoFac

程序员文章站 2023-02-21 08:00:17
第一次整理了下关于autofac的一些具体的用法 1. 安装 Autofac: Install-Package Autofac -Version 4.8.1 2. 创建两个类库项目,IService (用于编写接口),ServiceImpl(用于创建实现类) IService 下 public in ......

第一次整理了下关于autofac的一些具体的用法

1. 安装 autofac: install-package autofac -version 4.8.1

2. 创建两个类库项目,iservice (用于编写接口),serviceimpl(用于创建实现类)

  • 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();
}

  • serviceimpl下

public class dog : ianimalbark,ianimalsleep
{
public void bark()
{
console.writeline("汪汪汪汪汪");
}

public void sleep()
{
console.writeline("zz,睡着了");
}
}

public class cat : ianimalbark
{
public void bark()
{
console.writeline("喵喵喵");
}
}

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("放学了");
}
}

3. 原理性使用方法,如果再有一个接口和一个实现类,那就再注册一次

containerbuilder builder = new containerbuilder();
//注册实现类dog,当我们 请求ianimalbark接口 的时候返回的是类dog的对象,原理性的代码
builder.registertype<dog>().as<ianimalbark>();
//上面一句也可改成下面一句,这样 请求dog实现的任何接口 的时候都会返回dog对象,原理性的代码
//builder.registertype<dog>().asimplementedinterfaces();
icontainer container = builder.build();
//请求ianimalbark接口
ianimalbark dog = container.resolve<ianimalbark>();
dog.bark();
console.readkey();

4. 如果有很多接口,很多实现类,每次都要注册一次会很麻烦,可以如下进行一次注册

containerbuilder builder = new containerbuilder();
assembly asm = assembly.load("service");//实现类所在的程序集名称
builder.registerassemblytypes(asm).asimplementedinterfaces();//常用
icontainer container = builder.build();
ianimalbark dog = container.resolve<ianimalbark>();
iuser user = container.resolve<iuser>();
dog.bark();
user.addnew("baidu","123");
console.readkey();

5. 如果有多个实现类,container.resolve<ianimalbark>();只会返回其中一个对象,如果想返回多个类的对象,应改成container.resolve<ienumerable<ianimalbark>>();

containerbuilder builder = new containerbuilder();
assembly asm = assembly.load("service");//实现类所在的程序集名称
builder.registerassemblytypes(asm).asimplementedinterfaces();//常用
icontainer container = builder.build();
ienumerable<ianimalbark> animals = container.resolve<ienumerable<ianimalbark>>();
foreach(var animal in animals)
{
animal.bark();
}
console.readkey();

6. 如果一个实现类中定义了其他类型的属性(接口类型的属性),在注册时又加上builder.registerassemblytypes(asm).asimplementedinterfaces().propertiesautowired();这样会给属性进行“注入”

containerbuilder builder = new containerbuilder();
assembly asm = assembly.load("service");//实现类所在的程序集名称
builder.registerassemblytypes(asm).asimplementedinterfaces().propertiesautowired();//常用
icontainer container = builder.build();
ischool school = container.resolve<ischool>();
school.afterschool();
console.readkey();

7. 可以通过在builder.registerassemblytypes(asm)后面以 instance***()配置来实现auto对象的生命周期

  •  instanceperdependency()每次resolve都返回新的对象

containerbuilder builder = new containerbuilder();
assembly asm = assembly.load("service");//实现类所在的程序集名称
builder.registerassemblytypes(asm).asimplementedinterfaces().propertiesautowired().instanceperdependency();//常用
icontainer container = builder.build();
ischool school = container.resolve<ischool>();
ischool school2 = container.resolve<ischool>();
console.writeline(school.equals(school2));
console.readkey();

  • singleinstance()每次resolve都返回同一个对象,推荐

containerbuilder builder = new containerbuilder();
assembly asm = assembly.load("service");//实现类所在的程序集名称
builder.registerassemblytypes(asm).asimplementedinterfaces().propertiesautowired().singleinstance();//常用
icontainer container = builder.build();
ischool school = container.resolve<ischool>();
ischool school2 = container.resolve<ischool>();
console.writeline(object.referenceequals(school,school2));
console.readkey();