Autofac入门与替代ASP.NET Core、ABP依赖注入容器
2021-02-08 16:19
标签:private ships dap 泛型类 res UNC worker 支持 ips Autofac 官网文档地址: 本文主要讲述如何使用 Autofac 框架完成依赖注入等操作,不涉及理论。 我们在 .NET Core 控制台程序中进行测试和实践。 首先我们添加一个接口以及实现: 然后在 Main 方法中注册以及构建容器: 我们则可以这样使用: 这就是 Autofac 的简单使用。 前面我们通过 或者通过类型(Type)进行注入: 当然,通过反射注册的组件,它会自动为你注入相应的构造函数。 我们也可以提前将实例注册进去: 这样就会生成一个单例应用。 当然你可以使用 Lambda 表达式树来 new : 这样可以避免外部有引用。 如果你不想这样,可以使用 如果一个类型的构造函数依赖于另一个接口,那么这种类型作为组件注册,就会复杂一些,我们可以使用 Lambda 表达式来注册组件。 有以下几个接口和类型: 那么我们可以先注册 A 类型,再注册 B 类型: 当然,这里使用表达式来介绍方便性。你也可以这样使用: 实例化 B 类型时,会自动为其注入构造函数。 如果要对泛型类型进行注册: 则可以使用 当然,如果 IA 也是泛型的话,应该使用 注册组件时,使用 注册: 那么,容器会自动给 B 类型的属性注入依赖。 当然,这样会为类型的每一个属性注入依赖。 如果我们只是想为某个属性注入的话,可以这样 使用 注册组件后,调用 参考前面的示例如下: 要注意的是,实例是从生命周期中解析(ILifetimeScope scope),而不是从容器中(IContainer)中解析。 在解析时,可以传递参数,这样可以控制容器生成实例时,使用能够构造函数实例化类型。 Autofac提供了多种不同的参数匹配机制: 示例如下: 或者改成: 另外,Autofac 还支持多种关系的服务解析,其种类如下: 关于生命周期,你可以参考:https://autofaccn.readthedocs.io/zh/latest/lifetime/index.html 前面我们看到,要获取实例,使用了 你可以使用 你也可以: 实例的作用域决定了对于暴露出来的同一个服务的实例如何在多个请求之间共享。组件的作用域是在注册组件是决定的,然后显式地调用 8.1 一个依赖一个实例 在 .NET 默认的依赖注入框架中,称为 你也可以使用 8.2 单一实例 8.3 生命周期作用域实例 使用 另外,层叠的生命周期作用域也是不同的,例如下面的示例中,结果是 另外 Autofac 还有其它方法的作用域管理,请点击链接了解: https://autofaccn.readthedocs.io/zh/latest/lifetime/instance-scope.html Autofac 是非常厉害的框架,本文只是挑入门基础部分讲解,其它自由度高一些的复杂一些的知识点例如: 需要查看文档学习,这里不再赘述。 ASP.NET Core 中,2.x 和 3.x 的差异比较多,这里只以 3.x 作为示例。 ASP.NET Core 中,默认的依赖注入,可以使用 例如: 如果要在 ASP.NET Core 中使用 Autofac 作为依赖注入容器,则还需要安装名为 然后在 Program 的 Host 中加上 示例如下: 然后在 Startup 类中,加上 最后在 即可使用 Autofac 作为 ASP.NET Core 依赖注入容器。 完整代码: 首先要求你添加了一个 ASP.NET Core 程序,然后配置 ABP ,引入相应的包。可以参考 https://docs.abp.io/zh-Hans/abp/latest/Getting-Started-AspNetCore-Application ABP 中,默认也是使用 当然,ABP 也可以使用 Autofac 作为依赖注入容器。 ABP 中要使用 Autofac,需要引用 然后在模块中加上 然后在 Startup 中的 Autofac入门与替代ASP.NET Core、ABP依赖注入容器 标签:private ships dap 泛型类 res UNC worker 支持 ips 原文地址:https://www.cnblogs.com/whuanle/p/13071680.html
https://autofaccn.readthedocs.io/zh/latest/index.htmlAutofac 的使用
1,简单的实践
public interface IMyService { }
public class MyService : IMyService { }
class Program
{
private static IContainer Container;
static void Main(string[] args)
{
// 创建容器构建器
var builder = new ContainerBuilder();
// 注册组件
builder.RegisterType
public static void Test()
{
// 生命周期管理
using (ILifetimeScope scope = Container.BeginLifetimeScope())
{
// 获取实例
IMyService myService = scope.Resolve
.AS()
用于暴露组件的服务。
下面我们来讨论更详细的使用方法以及实践。2,注册组件
ContainerBuilder
对象来注册组件并且告诉容器有哪些组件暴露了哪些服务。
组件的注册方式有很多种,前面我们使用了反射的方法去注册,传递一个泛型参数进去:.RegisterType
builder.RegisterType(typeof(MyService)).As
你也可以通过 UsingConstructor
方法,要求容器实例化组件时,使用哪一个构造函数:builder.RegisterType
MyService t = new MyService();
builder.RegisterInstance(t).As
不过,因为 RegisterInstance(t)
会保留对 t 的引用,也就是说将这个实例注册到容器的实例中。 builder.Register(c => new MyService()).As
ExternallyOwned
方法,这样就会生成一个新的实例到容器中。如果你会 AutoMapper ,这样会很容易理解。 builder.RegisterInstance(t).As
3,Lambda 注册组件
public interface IA { }
public class A : IA { }
public interface IB { }
public class B : IB
{
private IA _a;
public B(IA a)
{
_a = a;
}
}
builder.RegisterType().As
builder.RegisterType().As
4,注册泛型
public interface IA { }
public class A
RegisterGeneric
来注册泛型组件: builder.RegisterGeneric(typeof(A)).As
.As(typeof(IA))
。5,属性注入
PropertiesAutowired
方法,那么容器在生成实例时,会自动注入属性。
有以下类型: public interface IA { }
public class A : IA { }
public interface IB { }
public class B : IB
{
public IA A { get; set; }
}
builder.RegisterType().As
WithProperty
方法,例如: builder.RegisterType().WithProperty("A",new A()).As
6,解析服务
Build()
方法生成了容器(IContainer)。
然后使用 Resolve
方法在其生命周期内解析服务。 using (ILifetimeScope scope = Container.BeginLifetimeScope())
{
// 获取实例
IMyService myService = scope.Resolve
如果想知道一个服务是否已经被注册,我们可以使用 ResolveOptional()
或 TryResolve()
方法。 using (ILifetimeScope scope = Container.BeginLifetimeScope())
{
IB b;
// 获取实例
if (scope.TryResolve
namespace AutofacTest
{
public interface IA { }
public class A : IA
{
public A(string a, string b) { Console.WriteLine($"a = {a}, b = {b}"); }
}
class Program
{
private static IContainer Container;
static void Main(string[] args)
{
// 创建容器构建器
var builder = new ContainerBuilder();
builder.RegisterType().As
IA b = scope.Resolve
7,生命周期
using (ILifetimeScope scope = Container.BeginLifetimeScope())
{
}
BeginLifetimeScope
创建一个生命周期作用域,生命周期的作用域是可释放的并且可以追踪组件的释放。Dispose()
或者 using{}
形式进行生命周期释放。 using (ILifetimeScope scope = Container.BeginLifetimeScope())
{
using (ILifetimeScope sc = scope.BeginLifetimeScope())
{
}
}
8,实例作用域
Resolve()
返回地示例,就会出现具体的行为(单例等)。‘transient
或 factory
,对于每个请求,每次返回的都是不一样的实例。Autofac 默认就是这种模式。InstancePerDependency
显式声明:builder.RegisterType
SingleInstance
方法可以注册组件为单一实例:builder.RegisterType
InstancePerLifetimeScope
可以设置组件在一个生命周期作用域内,获取到的实例都是同一个。True,False
。 using (ILifetimeScope scope = Container.BeginLifetimeScope())
{
IA b = scope.Resolve
9,Autofac 其它需要学习的知识
ASP.NET Core
1,默认依赖注入
ConfigureServices
方法,在此方法中注册即可。 public void ConfigureServices(IServiceCollection services)
{
services.AddTransient
2,使用 Autofac
Microsoft.Extensions.DependencyInjection.Abstractions
的 Nuget 包。 .UseServiceProviderFactory(new AutofacServiceProviderFactory())
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseServiceProviderFactory(new AutofacServiceProviderFactory())
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup
ConfigureContainer
方法,然后在此方法中注册需要的组件: public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType().As
ConfiguraServices
方法中添加:services.AddOptions();
public void ConfigureServices(IServiceCollection services)
{
services.AddOptions();
services.AddControllers();
}
public void ConfigureContainer(ContainerBuilder builder)
{
builder.RegisterType().As
ABP
ConfigureServices
直接注入即可,使用示例: public class AppModule : AbpModule
{
public override void ConfigureServices(ServiceConfigurationContext context)
{
context.Services.AddTransient
context.Services
即为 IServiceCollection
对象。Volo.Abp.Autofac
包。[DependsOn(typeof(AbpAutofacModule))]
特性。 [DependsOn(typeof(AbpAutofacModule))]
public class AppModule : AbpModule{}
ConfiguraServices
方法中,添加 ABP 模块, 并且设置使用 Autofac。 public void ConfigureServices(IServiceCollection services)
{
services.AddApplication
文章标题:Autofac入门与替代ASP.NET Core、ABP依赖注入容器
文章链接:http://soscw.com/index.php/essay/52717.html