欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Net5学习笔记

程序员文章站 2022-06-11 15:49:16
IOC 容器IServiceCollection 什么是Ioc 把对象的统一创建交给第三方容器来创建 如何使用内置IOC ServerCollection 1.在Starup中的ConfigurServicetion方法中注册服务 services.AddSingleton

ioc 容器iservicecollection

什么是ioc
把对象的统一创建交给第三方容器来创建

如何使用内置ioc servercollection

1.在starup中的configurservicetion方法中注册服务

services.addsingleton<itestservicea, testservicea>();

---------------
 private readonly iserviceprovider _serviceprovider = null;
 
  itestservicea testservicea = (itestservicea)_serviceprovider.getservice(typeof(itestservicea));
            testservicea.show();

2.在使用的控制器中,通过构造函数,定义服务的抽象类型,作为参数,在运行时,得到具体的服务

3.调用服务内的方法

(视图中可以使用@inject获取实列)

di依赖注入:iserverconcetion支持构造函数注入

什么是依赖注入
如果对象a依赖对象b,对象b依赖对象c,就可以了先构造对象c传递给对象b,然后把b传递给a

iserver可以支持无限级层的依赖注入;前提是都要先注入服务(注册抽象和集体的映射关系)

iservercollention生命周期

那么再创建对象的时候,不同情况,不需要让对象单列,每一次都创建新的对象实列;不同的作用于新的实例

瞬时生命周期:addtransient 每一次getservice获取的实例都是不同的实例(项目中更多的使用)

单例生命周期:addsingleton单例生命周期,在整个进程中获取的都是同一个实例

作用域生命周期:addscoped 同一个作用域,获取的是同一个对象的实例;不同的作用域,获取的是不同的对象实例

#region iservicecollection生命周期解析

            //瞬时生命周期
            {
                //iservicecollection servicecollection = new servicecollection();
                //servicecollection.addtransient<itestservicea, testservicea>(); //瞬时生命周期,每一次getservice获取的实例都是不同的实例
                //serviceprovider serviceprovider = servicecollection.buildserviceprovider();
                //itestservicea testservicea = serviceprovider.getservice<itestservicea>();
                //itestservicea testservicea1 = serviceprovider.getservice<itestservicea>();
                //bool isok = object.referenceequals(testservicea, testservicea1); //结果为false; 两次获取的对象不是同一个实例
            }

            //单例生命周期
            {
                //iservicecollection servicecollection = new servicecollection();
                //servicecollection.addsingleton<itestservicea, testservicea>(); //单例生命周期,在整个进程中获取的都是同一个实例
                //serviceprovider serviceprovider = servicecollection.buildserviceprovider();
                //itestservicea testservicea = serviceprovider.getservice<itestservicea>();
                //itestservicea testservicea1 = serviceprovider.getservice<itestservicea>();
                //bool isok = object.referenceequals(testservicea, testservicea1); //结果为 true,是同一个引用,在整个进程中获取的都是同一个实例
            }

            ///作用域生命周期
            {
                //iservicecollection servicecollection = new servicecollection();
                //servicecollection.addscoped<itestservicea, testservicea>(); //作用域生命周期;同一个作用域,获取的是同一个对象的实例;不同的作用域,获取的是不同的对象实例
                //serviceprovider serviceprovider = servicecollection.buildserviceprovider();
                //itestservicea testservicea = serviceprovider.getservice<itestservicea>();
                //itestservicea testservicea1 = serviceprovider.getservice<itestservicea>();

                //bool isok = object.referenceequals(testservicea, testservicea1);

                //serviceprovider serviceprovider1 = servicecollection.buildserviceprovider();
                //itestservicea testservicea2 = serviceprovider1.getservice<itestservicea>();
                //bool isok1 = object.referenceequals(testservicea1, testservicea2);
            }


            #endregion

autofac容器初识

auto 是一款有优秀的ioc容器:那么如何使用?第三方容器

  1. nuget引入程序包autofac
  2. 创建containerbuilder
  3. 注册首先和实现的关系
  4. build一下,得到container容器
  5. 用去获取服务实例
  6. 使用服务

代码实现

                //构造函数注入
                //containerbuilder containerbuilder = new containerbuilder();
                //containerbuilder.registertype<testservicea>().as<itestservicea>();
                //containerbuilder.registertype<testserviceb>().as<itestserviceb>();
                //containerbuilder.registertype<testservicec>().as<itestservicec>();
                //icontainer container = containerbuilder.build();
                //testserviceb testserviceb = container.resolve<testserviceb>();//获取服务
                //testserviceb.show();

autofac多种注入方式

构造函数注入

           {
                ////构造函数注入
                //containerbuilder containerbuilder = new containerbuilder();
                //containerbuilder.registertype<testservicea>().as<itestservicea>();
                //containerbuilder.registertype<testserviceb>().as<itestserviceb>();
                //containerbuilder.registertype<testservicec>().as<itestservicec>();
                //icontainer container = containerbuilder.build();
                //itestserviceb testserviceb = container.resolve<itestserviceb>();//获取服务
                //testserviceb.show();
            }

属性注入

          //{
            //    containerbuilder containerbuilder = new containerbuilder();
            //    containerbuilder.registertype<testservicea>().as<itestservicea>();
            //    containerbuilder.registertype<testserviceb>().as<itestserviceb>();
            //    containerbuilder.registertype<testservicec>().as<itestservicec>();
            //    containerbuilder.registertype<testserviced>().as<itestserviced>().propertiesautowired();
            //    icontainer container = containerbuilder.build();
            //    itestserviced testserviced = container.resolve<itestserviced>();//获取服务
            //    testserviced.show();
            //}

方法注入

 //{
            //    containerbuilder containerbuilder = new containerbuilder();
            //    containerbuilder.registertype<testservicea>().as<itestservicea>();
            //    //containerbuilder.registertype<testserviceb>().as<itestserviceb>();
            //    containerbuilder.registertype<testserviceb>().onactivated(e => e.instance.setservice(e.context.resolve<itestservicea>())).as<itestserviceb>();
            //    containerbuilder.registertype<testservicec>().as<itestservicec>();
            //    containerbuilder.registertype<testserviced>().as<itestserviced>().propertiesautowired();
            //    icontainer container = containerbuilder.build();
            //    itestserviceb testserviceb = container.resolve<itestserviceb>();//获取服务
            //    testserviceb.show();
            //}

autofac生命周期

  1. 瞬时生命周期 ---每一期获取对象都是一个全新的实例(默认的生命)
{ //瞬时生命周期 ---每一期获取对象都是一个全新的实例(默认的生命)
                    //containerbuilder containerbuilder = new containerbuilder();
                    //containerbuilder.registertype<testservicea>().as<itestservicea>().instanceperdependency();
                    //icontainer container = containerbuilder.build();
                    //itestservicea testservicea = container.resolve<itestservicea>();//获取服务
                    //itestservicea testservicea1 = container.resolve<itestservicea>();//获取服务
                    //console.writeline(object.referenceequals(testservicea, testservicea1));
                }
  1. 单例生命周期---在整个进程中,对象永远都是同一个实例(singleinstance)
 { //单例生命周期---在整个进程中,对象永远都是同一个实例(singleinstance)
                    //containerbuilder containerbuilder = new containerbuilder();
                    //containerbuilder.registertype<testservicea>().as<itestservicea>().singleinstance();
                    //icontainer container = containerbuilder.build();
                    //itestservicea testservicea = container.resolve<itestservicea>();//获取服务
                    //itestservicea testservicea1 = container.resolve<itestservicea>();//获取服务
                    //console.writeline(object.referenceequals(testservicea, testservicea1));
                }
  1. 每个生命周期范围一个实例--同一个生命周期范围内是同一个实例,不同的生命周期范围,实例不一样; (instanceperlifetimescope)

                    { //每个生命周期范围一个实例--同一个生命周期范围内是同一个实例,不同的生命周期范围,实例不一样;  (instanceperlifetimescope)
                        //containerbuilder containerbuilder = new containerbuilder();
                        //containerbuilder.registertype<testservicea>().as<itestservicea>().instanceperlifetimescope();
                        //icontainer container = containerbuilder.build();
    
                        //itestservicea testservicea15 = null;
                        //itestservicea testservicea16 = null;
                        //using (var scope1 = container.beginlifetimescope()) //生命周期范围
                        //{
                        //    itestservicea testservicea11 = scope1.resolve<itestservicea>();
                        //    itestservicea testservicea12 = scope1.resolve<itestservicea>();
                        //    console.writeline(object.referenceequals(testservicea11, testservicea12));
                        //    testservicea15 = testservicea12;
                        //}
    
                        //using (var scope1 = container.beginlifetimescope())
                        //{
                        //    itestservicea testservicea13 = scope1.resolve<itestservicea>();
                        //    itestservicea testservicea14 = scope1.resolve<itestservicea>();
                        //    console.writeline(object.referenceequals(testservicea13, testservicea14));
                        //    testservicea16 = testservicea14;
                        //}
                        //console.writeline(object.referenceequals(testservicea15, testservicea16));
                    }
    
  2. 每个【匹配生命周期范围一个实例】(instancepermatchinglifetimescope(名称))

 { //每个【匹配生命周期范围一个实例】(instancepermatchinglifetimescope(名称))
                    //containerbuilder containerbuilder = new containerbuilder();
                    //containerbuilder.registertype<testservicea>().as<itestservicea>().instancepermatchinglifetimescope("zhaoxi");

                    //icontainer container = containerbuilder.build();

                    //itestservicea testservicea15 = null;
                    //itestservicea testservicea16 = null;
                    //using (var scope1 = container.beginlifetimescope("zhaoxi"))
                    //{
                    //    itestservicea testservicea11 = scope1.resolve<itestservicea>();
                    //    using (var scope2 = scope1.beginlifetimescope())
                    //    {
                    //        itestservicea testservicea12 = scope2.resolve<itestservicea>();
                    //        console.writeline(object.referenceequals(testservicea11, testservicea12));
                    //    }
                    //    testservicea15 = testservicea11;
                    //}

                    //using (var scope1 = container.beginlifetimescope("zhaoxi"))
                    //{
                    //    itestservicea testservicea13 = scope1.resolve<itestservicea>();
                    //    using (var scope2 = scope1.beginlifetimescope())
                    //    {
                    //        itestservicea testservicea14 = scope2.resolve<itestservicea>();
                    //        console.writeline(object.referenceequals(testservicea13, testservicea14));
                    //    }

                    //    testservicea16 = testservicea13;
                    //}
                    //console.writeline(object.referenceequals(testservicea15, testservicea16));
                }
  1. 每个请求一个实例(instanceperrequest) ---mvc中

     ////每个请求一个实例(instanceperrequest)
                        //containerbuilder containerbuilder = new containerbuilder();
                        //containerbuilder.registertype<testservicea>().as<itestservicea>().instanceperrequest();
                        //icontainer container = containerbuilder.build(); 
                        //itestservicea testservicea11 = container.resolve<itestservicea>();
                        //itestservicea testservicea12 = container.resolve<itestservicea>();
                        //console.writeline(object.referenceequals(testservicea11, testservicea12));
    
    

autofac支持配置文件

nuget引入支持配置文件:

autofac. extensions.dependencyinjection
aputofac.configuration
autofac

              {
                //containerbuilder containerbuilder = new containerbuilder();
                //// 就可以在这里写入autofac注入的各种 
                //{
                //    //读取配置文件,把配置关系装载到containerbuilder
                //    iconfigurationbuilder config = new configurationbuilder();
                //    iconfigurationsource autofacjsonconfigsource = new jsonconfigurationsource()
                //    {
                //        path = "cfgfile/autofac.json",
                //        optional = false,//boolean,默认就是false,可不写
                //        reloadonchange = true,//同上
                //    };
                //    config.add(autofacjsonconfigsource);
                //    configurationmodule module = new configurationmodule(config.build());
                //    containerbuilder.registermodule(module);
                //}
                //icontainer container = containerbuilder.build();
                //itestservicea testservicea = container.resolve<itestservicea>();
                //itestserviced testserviced = container.resolve<itestserviced>();
                //testserviced.show();
            }

autofac整合

autofac是一个第三方容器

  1. 指定autofac工厂替换默认工厂,program指定

program中createhostbuilder的hostbuilder添加.useserviceproviderfactory(new autofacserviceproviderfactory());

var hostbuilder = host.createdefaultbuilder(args) //创建一个默认的主机builder
                //.configurelogging(loggingbuilder=> 
                //{  //配置log4net配置文件的读取
                //    loggingbuilder.addlog4net("cfgfile/log4net.config");
                //}) 
                .configurewebhostdefaults(webbuilder =>  //配置成一个默认的web主机
                {
                    webbuilder.usestartup<startup>(); //使用startup文件来实现配置

                }).useserviceproviderfactory(new autofacserviceproviderfactory()); 
  1. 在startup类增加configurecontainer方法,注册关系

     public void configurecontainer(containerbuilder containerbuilder)
    {
        containerbuilder.registertype<testservicea>().as<itestservicea>();
    }
    

    autofac支持控制器属性注入

    控制器是一个类, 控制器的实例其实是icontrolleractivator来创建的;

    1. 得让控制器使用容器来获取实例;
    2. 注册控制器抽象和具体的关系
    var controllerstypesinassembly = typeof (startup) .assembly . getexportedtypes()
    .where(type => typeof (controllerbase) .isassi gnab1efrom(type)). toarray();
    builder .registertypes (control1erstypes inassemb1y) . propertiesautowired(new autowiredpropertyselector();
    
  2. 在控制器内定义属性

  3. 扩展,自己控制究竟哪些属性需要做依赖注入

//指定控制器实例让容器来创建
           services.replace(servicedescriptor.transient<icontrolleractivator, servicebasedcontrolleractivator>());

autofac抽象多实现的问题

  1. 一个抽象多个实例,都注册了,通过构造函数用抽象类型来获取实例,哪个后面注册就获取到哪一个;覆盖型;
  2. 个抽象多个实例,都注册了,可以通过一个ienumerable<抽象> ,当做构造函数参数,可以获取到所有注册的具体的实例;
  3. 注册一个抽象的多个实例资源,如下方式注册,可以在控制器的构造函数中,使用具体实现类型作为参数类型,可以匹配到不同到具体
    类型实例
ontainerbuilder.registersource (new anyconcretetypenotalreadyregisteredsource(t =>
t. isassignab1eto<iestservicea>());

aop 5个filter

aop:可以在不修改之前的代码为基础,可以动态的增加新功能;

authorizationfilter鉴权授权
resourcefilter资源
exceptionfilter异常
actionfilter方法
resultfilter

actionfilter的特点

自定义一个customactionfilterattribute特性,继承attribute, 实现iactionfilter接口; 实现方法,标记在action上;
请求标记的有customactionfilterattribute的action:执行顺序如下:

  1. 执行控制器构造函数
  2. 执行customactionfilterattribute内的onactionexecuting方法
  3. 执行action .
  4. 执行customactionfilterattribute内的onactionexecuted

actionfiler 的多种实现

  1. 通过实现iactionfilter接口来完成扩展
  2. 通过继承actionfilteraltribute (系统提供的实现) , 根据自己的需要,覆写不同的方法,达到自己的诉求
  3. 异步版本的实现,通过实现iasyncactionfilter接口来实现

filter 的多种注册和扩展

  1. [customactioniter--fitler必须有无参数构造函数
  2. [typefilter(typeof(customactionfiterattributel)],可以没有无参数构造函数,可以支持依赖注入
  3. [servicefilter(typeof(customactionfilterattributel)],可以没有无参数构造函数,可以支持依赖注入,必须要注册服务

filterfactory扩展定制

可以使用servicefilter/typefilter就可以支持依赖注入呢? --_-定是ioc容器来完成;

1.自定义一个特性类,继承attribute,实现接口ifilterfactory; 实现接口中的方法

2.通过构造函数传递需要实例化的特性的type类型

3.在实现接口中,通过type类型获取到实例

4.标记在action.上面

Net5学习笔记