zoukankan      html  css  js  c++  java
  • 容器之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; } } }
    人各有命,上天注定,有人天生为王,有人落草为寇。脚下的路,如果不是你自己的选择,那么旅程的终点在哪,也没人知道。你会走到哪,会遇到谁,都不一定。
  • 相关阅读:
    Debian 安装配置(包括kdevelop)
    linux matlab2016 安装
    Qt5.7 无法输入中文问题
    阻塞方法与InterruptedException
    java的null
    原子性、可见性、有序性与指令重排序
    物理机内存模型与java内存模型
    java构造函数总结
    什么时候需要用super
    重载与重写
  • 原文地址:https://www.cnblogs.com/ZkbFighting/p/14680895.html
Copyright © 2011-2022 走看看