Autofac 依赖注入教程

Myth丶恋晨 2022-02-01 05:04 287阅读 0赞
  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(“放学了”);
}
}

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

ContainerBuilder builder = new ContainerBuilder();
//注册实现类Dog,当我们 请求IAnimalBark接口 的时候返回的是类Dog的对象,原理性的代码
builder.RegisterType().As();
//上面一句也可改成下面一句,这样 请求Dog实现的任何接口 的时候都会返回Dog对象,原理性的代码
//builder.RegisterType().AsImplementedInterfaces();
IContainer container = builder.Build();
//请求IAnimalBark接口
IAnimalBark dog = container.Resolve();
dog.Bark();
Console.ReadKey();

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

ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load(“Service”);//实现类所在的程序集名称
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();//常用
IContainer container = builder.Build();
IAnimalBark dog = container.Resolve();
IUser user = container.Resolve();
dog.Bark();
user.AddNew(“baidu”,“123”);
Console.ReadKey();

  1. 如果有多个实现类,container.Resolve();只会返回其中一个对象,如果想返回多个类的对象,应改成container.Resolve();

ContainerBuilder builder = new ContainerBuilder();
Assembly asm = Assembly.Load(“Service”);//实现类所在的程序集名称
builder.RegisterAssemblyTypes(asm).AsImplementedInterfaces();//常用
IContainer container = builder.Build();
IEnumerable animals = container.Resolve();
foreach(var animal in animals)
{
animal.Bark();
}
Console.ReadKey();

  1. 如果一个实现类中定义了其他类型的属性(接口类型的属性),在注册时又加上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();
school.AfterSchool();
Console.ReadKey();

  1. 可以通过在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 school2 = container.Resolve();
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 school2 = container.Resolve();
Console.WriteLine(object.ReferenceEquals(school,school2));
Console.ReadKey();

发表评论

表情:
评论列表 (有 0 条评论,287人围观)

还没有评论,来说两句吧...

相关阅读

    相关 依赖注入

    把有依赖关系的类放到容器中,解析出这些类的实例,就是依赖注入。目的是实现类的解耦。 实例:Class A中用到了Class B的对象b,一般情况下,需要在A的代码中显式的ne