一起养成写作习惯!这是我参与「掘金日新计划 · 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.cs
namespace AutofacDmeo.unity
{
[AttributeUsage(AttributeTargets.Property)] //只能标记在属性上
public class CustomSelectAttribute:Attribute
{
}
}
//root.cs
using 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));
}
}
}