.Netcore讲解(一)

146 阅读2分钟

一起养成写作习惯!这是我参与「掘金日新计划 · 4 月更文挑战」的第11天,点击查看活动详情

前言

今天我来讲一讲# ASP.NETCore6.0如何使用ServiceCollection,serviceCollection是内置的属性,我们可以直接进行注入,然后就是Autofac,大家一起来看看吧。

ASP.NETCore6.0如何使用ServiceCollection

注册抽象和具体之间的关系

构造函数注入支持

//program.cs 
​
builder.Services.AddTransient<IUserService, UserService>();
​
//HandleRequirement.cs
​
  private IUserService _userService;
        private IUserService _userService2;
        public HandleRequirement(IUserService userService, IServiceProvider serviceProvider)
        {
            this._userService = userService;
            _userService2= serviceProvider.GetService<IUserService>();
        }

Autofac基本使用

Nuget引入

创建容器

注册抽象和具体之间的关系

获取实例

     public void show()
        {
            //1.Nuget引入程序包
            //2.得到容器创造者   ContainerBuilder
            //3.配置抽象和具体类之间的关系
            //4.Buid一下得到容器实例
            //5.基于容器来获取对象实例
​
            ContainerBuilder containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterType<test>().As<Itest>();
            IContainer container = containerBuilder.Build();
            Itest t = container.Resolve<Itest>();
        }

Autofac的多种注册

注册抽象和普通类

注册具体实例

注册一段业务逻辑

注册泛型

注册程序集

1.
         public void show()
        {
            //1.Nuget引入程序包
            //2.得到容器创造者   ContainerBuilder
            //3.配置抽象和具体类之间的关系
            //4.Buid一下得到容器实例
            //5.基于容器来获取对象实例
​
            ContainerBuilder containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterType<test>().As<Itest>();
            IContainer container = containerBuilder.Build();
            Itest t = container.Resolve<Itest>();
        }
​
​
2.
    
         public void show()
        {
            ContainerBuilder containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterType<test>().As<Itest>();
            containerBuilder.Register<IPower>(context=>
            {
                //这里的业务逻辑负责创建出Ipowe的实例,可以给一个入口,创建对象的实例
                Itest t = context.Resolve<Itest>();
                IPower power = new Power();
            })
            IContainer container = containerBuilder.Build();
            IPower t = container.Resolve<IPower>();
        }
​
​
​
3.
     public void show()
        {
            ContainerBuilder containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterInstance(new test() );
            IContainer container = containerBuilder.Build();
            Itest t = container.Resolve<Itest>();
        }
    
​
​
4.
    public void show()
        {
            ContainerBuilder containerBuilder = new ContainerBuilder();
            containerBuilder.RegisterGeneric(typeof(List<>).As(typeof(List<>))
            IContainer container = containerBuilder.Build();
             List<Itest> t = container.Resolve<List<Itest>>();
        }
​
                                             
                                          
                                             
 5.  
       public void show()
        {
            ContainerBuilder containerBuilder = new ContainerBuilder();
       Assembly interfaceAssembly = Assembly.LoadFrom("...dll");
         Assembly sAssembly = Assembly.LoadFrom("...dll");    
       containerBuilder.RegisterAseemblyTypes(interfaceAssembly,sAssembly).AsImplenmentInterfaces();
            ICntainer container = containerBuilder.Build();
            Itest t = container.Resolve<Itest>();
        }                                        
                                             

构造函数注入

构造函数注入基本使用

扩展

 //构造函数注入
​
            //ContainerBuilder containerBuilder = new ContainerBuilder();
            //containerBuilder.RegisterType<test>().As<Itest>();
            //containerBuilder.RegisterType<head>().As<Ihead>();
            //IContainer container = containerBuilder.Build();
            //Ihead h = container.Resolve<Ihead>();
​
​
            //如果有多个构造函数,默认是选择多的,UsingConstructor 可以指定那个构造函数
​
            //ContainerBuilder containerBuilder = new ContainerBuilder();
            //containerBuilder.RegisterType<test>().As<Itest>();
            //containerBuilder.RegisterType<head>().As<Ihead>();
            ///*containerBuilder.RegisterType<head>().UsingConstructor(typeof(Itest)).As<Ihead>(); */  //指定了一个参数的构造函数
            //IContainer container = containerBuilder.Build();
            //Ihead h = container.Resolve<Ihead>();

属性注入

属性注入

扩展-PropertiesAutowired

//Autofac1.cs 
​
//属性注入
​
            //{
            //    ContainerBuilder containerBuilder = new ContainerBuilder();
            //    containerBuilder.RegisterType<test>().As<Itest>(); 
            //    containerBuilder.RegisterType<head>().As<Ihead>();
            //    containerBuilder.RegisterType<root>().As<Iroot>().PropertiesAutowired();
            //    //表示支持属性注入,对象被创建以后,自动给属性创建实例,赋值上去
            //    IContainer container = containerBuilder.Build();
            //    Iroot r = container.Resolve<Iroot>();
​
            //}

属性注入

属性注入--PropertiesAutowired --所有属性都注入了---不是我们想要的,希望能够自己来控制

扩展-PropertySelector--用来选择哪个数据可以支持属性注入

//Autofac1.cs //属性注入(选择) --支持IPropertySelector
​
            {
                ContainerBuilder containerBuilder = new ContainerBuilder();
                containerBuilder.RegisterType<test>().As<Itest>();
                containerBuilder.RegisterType<head>().As<Ihead>();
                containerBuilder.RegisterType<root>().As<Iroot>().PropertiesAutowired(new CustomPropertySelect());
                //表示支持属性注入,对象被创建以后,自动给属性创建实例,赋值上去
                IContainer container = containerBuilder.Build();
                Iroot r = container.Resolve<Iroot>();
​
            }
​
​
​
//CustomSelectAttribute.csnamespace AutofacDmeo.unity
{
​
    [AttributeUsage(AttributeTargets.Property)]  //只能标记在属性上
    public class CustomSelectAttribute:Attribute
    {
    }
}
​
​
​
​
//root.csusing AutofacDmeo.demo1;
using AutofacDmeo.unity;
​
namespace AutofacDmeo.inproper
{
    public class root:Iroot
    {
​
        public Ihead H {get;set;}
        
​
          [CustomSelect]
        public Itest T { get;set;}
​
        public root(Ihead ihead)
        {
            this.H = ihead;
        }
    }
}
​
​
​
//CustomPropertySelect.cs
using Autofac.Core;
using System.Reflection;
​
namespace AutofacDmeo.unity
{
    public class CustomPropertySelect : IPropertySelector
    {
        public bool InjectProperty(PropertyInfo propertyInfo, object instance)
        {
            return propertyInfo.CustomAttributes.Any(c => c.AttributeType == typeof(CustomSelectAttribute));
        }
    }
}
​
​