自动量热仪,台湾电影赛德克巴莱,福5鼠之战国烽烟
第一次整理了下关于autofac的一些具体的用法
1. 安装 autofac: install-package autofac -version 4.8.1
2. 创建两个类库项目,iservice (用于编写接口),serviceimpl(用于创建实现类)
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 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对象的生命周期
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();
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();
如对本文有疑问,请在下面进行留言讨论,广大热心网友会与你互动!! 点击进行留言回复
Net Core Web Api项目与在NginX下发布的方法
asp.net core3.1 引用的元包dll版本兼容性问题解决方案
IdentityServer4实现.Net Core API接口权限认证(快速入门)
ASP.NET Core MVC通过IViewLocationExpander扩展视图搜索路径的实现
网友评论