容器之Autofac

承接上一篇

首先理解两个词:
服务===》接口
组件===》类

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; } } }

 

posted @ 2021-04-20 14:25  ProZkb  阅读(108)  评论(0编辑  收藏  举报