首先理解两个词:
服务===》接口
组件===》类
1:使用Autofac第一就是要先Nuget这个包:
autofac--》AutoFac.Extensions.Dependencyinjection
2:在启动项配置下:
public static IHostBuilder CreateHostBuilder(string[] args) => Host.CreateDefaultBuilder(args).UseServiceProviderFactory(new AutofacServiceProviderFactory())//这样就添加了ActoFac容器 .ConfigureWebHostDefaults(webBuilder => { webBuilder.UseStartup<Startup>(); });
3:添加一个对容器的配置函数然后对ActoFac进行添加
public void ConfigureContainer(ContainerBuilder builder)//Autofac.ContainerBuilder { //这是只注入了组件(类),Autofac也是可以直接注入类,也是可以直接使用的 //builder.RegisterType<TestServiceTemp>(); //这是注入了服务(接口)//SingleInstance() 是单例模式//InstancePerLifetimeScope() 作用域 //builder.RegisterType<TestServiceTemp>().As<ITestServices>().InstancePerLifetimeScope(); builder.RegisterType<TestServiceTemp>().As<ITestServices>(); //builder.RegisterType<ConstructorTemp>().As<IConstructor>(); builder.RegisterType<ConstructorTemp>().As<IConstructor>().UsingConstructor(); //UsingConstructor关键字是可以指定构造函数进行注册 //就是说,你注册的一个构造函数有带参数的,有不带参数的, //可以用这个字指定无参数; //如果多个参数不带这个字就是有参数 //还可以指定特定的实例来进行注入 //var Instance = new ConstructorTemp(); //builder.RegisterInstance(Instance).As<IConstructor>(); //后面还是lamda表达式进行注入
//这里就几个芝士点:
1.AutoFac支持直接注入类
2.AS()关键字转成注入接口 3.生命周期的两个关键字
4.UsingConstructor 指定函数参数关键字
5.指定实例进行注入
... //RegisterType:注册一个类; //AS:将类注册为此接口; //SingleInstance() 是单例模式 全局只有一个; //InstancePerLifetimeScope() 作用域 在同一个作用域,服务请求只创建一次; }
控制器Code:
[Route("api/[controller]")] [ApiController] public class AutofacController : ControllerBase { //当有请求的时候,注入会先直接去找你在SartUp中注入的类,开展活动(接口类的逻辑处理)
//当你Debug到下面的代码的时候,接口Iconstructor的继承类都已经把默认值,构造函数啥的搞定了。 public IConstructor _constructor; public AutofacController(IConstructor constructor) { _constructor = constructor; } public Tuple<int, int> Get() { int before = _constructor.service.count; _constructor.service.Add(); int after = _constructor.service.count; return new Tuple<int, int>(before, after); } }
public interface IConstructor { public ITestServices service { get; } }
public class ConstructorTemp : IConstructor { public ConstructorTemp() { Console.WriteLine("0参数的构造函数"); }
public ITestServices _services; public ConstructorTemp(ITestServices services) { _services = services; Console.WriteLine("有参数的构造函数"); } public ITestServices service { get { return _services; } } }