您现在的位置是:网站首页> 编程资料编程资料
.NET Core使用Autofac容器的DI依赖注入,IOC控制反转及AOP切面编程_实用技巧_
2023-05-24
402人已围观
简介 .NET Core使用Autofac容器的DI依赖注入,IOC控制反转及AOP切面编程_实用技巧_
Autofac 容器
Autofac 是一款.NET IoC 容器 . 它管理类之间的依赖关系, 从而使 应用在规模及复杂性增长的情况下依然可以轻易地修改 . 它的实现方式是将常规的.net类当做组件处理.
- 安装 NuGet 程序包:
Autofac 6.0.0 - 创建一个 ContainerBuiler
- 注册接口和实现关系
- 通过 ContainerBuiler 的 Build 方法,得到 IContainer 容器
- 通过 IContainer 容器获取实例
- 使用服务
ITestServiceA和TestServiceA
public interface ITestServiceA { void Show(); } public class TestServiceA : ITestServiceA { public TestServiceA() { Console.WriteLine($"{this.GetType().Name} 被构造了..."); } public void Show() { Console.WriteLine($"This is a {this.GetType().Name} Instance..."); } }- Program 中的
Main方法
var builder = new ContainerBuilder(); builder.RegisterType().As (); var container = builder.Build(); // 获取服务实例 var testService = container.Resolve (); testService.Show();
Autofac 多种注入方式
ITestServiceB和TestServiceB
public interface ITestServiceB { void Show(); } public class TestServiceB : ITestServiceB { private ITestServiceA _testServiceA; public void SetService(ITestServiceA testServiceA) { _testServiceA = testServiceA; } public TestServiceB() { Console.WriteLine($"{this.GetType().Name} 被构造了..."); } public void Show() { // _testServiceA.Show(); Console.WriteLine($"This is a {this.GetType().Name} Instance..."); } }ITestServiceC和TestServiceC
public interface ITestServiceC { void Show(); } public class TestServiceC : ITestServiceC { public TestServiceC() { Console.WriteLine($"{this.GetType().Name} 被构造了..."); } public void Show() { Console.WriteLine($"This is a {this.GetType().Name} Instance..."); } }ITestServiceD和TestServiceD
public interface ITestServiceD { void Show(); } public class TestServiceD : ITestServiceD { public ITestServiceA TestServiceA { get; set; } public ITestServiceB TestServiceB { get; set; } public ITestServiceC TestServiceC { get; set; } public TestServiceD() { Console.WriteLine($"{this.GetType().Name} 被构造了..."); } public void Show() { // TestServiceA.Show(); // TestServiceB.Show(); // TestServiceC.Show(); Console.WriteLine($"This is a {this.GetType().Name} Instance..."); } }- 构造函数注入
var builder = new ContainerBuilder(); builder.RegisterType().As (); builder.RegisterType ().As (); builder.RegisterType ().As (); builder.RegisterType ().As (); var container = builder.Build(); // 获取服务实例 var testService = container.Resolve (); testService.Show();
- 属性注入
var builder = new ContainerBuilder(); builder.RegisterType().As (); builder.RegisterType ().As (); builder.RegisterType ().As (); builder.RegisterType ().As ().PropertiesAutowired(); var container = builder.Build(); // 获取服务实例 var testService = container.Resolve (); testService.Show();
- 方法注入
var builder = new ContainerBuilder(); builder.RegisterType().As (); builder.RegisterType ().OnActivated(e => e.Instance.SetService(e.Context.Resolve ()) ).As (); builder.RegisterType ().As (); builder.RegisterType ().As (); var container = builder.Build(); // 获取服务实例 var testService = container.Resolve (); testService.Show();
Autofac 生命周期
- InstancePerDependency :默认模式,每次调用,都会重新实例化对象;每次请求都创建一个新的对象;
var builder = new ContainerBuilder(); builder.RegisterType().As ().InstancePerDependency(); var container = builder.Build(); var testServiceA = container.Resolve (); var testServiceA1 = container.Resolve (); Console.WriteLine(object.ReferenceEquals(testServiceA,testServiceA1));
- SingleInstance :单例模式,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;
var builder = new ContainerBuilder(); builder.RegisterType().As ().SingleInstance(); var container = builder.Build(); var testServiceA = container.Resolve (); var testServiceA1 = container.Resolve (); Console.WriteLine(object.ReferenceEquals(testServiceA,testServiceA1));
- InstancePerLifetimeScope : 同一个生命周期域中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;且每个不同的生命周期域中的实例是唯一的,不共享的。
var builder = new ContainerBuilder(); builder.RegisterType().As ().InstancePerLifetimeScope(); var container = builder.Build(); ITestServiceA testServiceA15; ITestServiceA testServiceA16; using (var scope1 = container.BeginLifetimeScope()) { var testServiceA11 = scope1.Resolve (); var testServiceA12 = scope1.Resolve (); Console.WriteLine(object.ReferenceEquals(testServiceA11,testServiceA12)); testServiceA15 = testServiceA12; } using (var scope1 = container.BeginLifetimeScope()) { var testServiceA13 = scope1.Resolve (); var testServiceA14 = scope1.Resolve (); Console.WriteLine(object.ReferenceEquals(testServiceA13,testServiceA14)); testServiceA16 = testServiceA14; } Console.WriteLine(object.ReferenceEquals(testServiceA15,testServiceA16));
- InstancePerMatchingLifetimeScope : 同一个匹配的生命周期域中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;且每个不匹配的生命周期域中的实例是唯一的,不共享的。
var builder = new ContainerBuilder(); builder.RegisterType().As () .InstancePerMatchingLifetimeScope("Run2948"); var container = builder.Build(); ITestServiceA testServiceA15; ITestServiceA testServiceA16; using (var scope1 = container.BeginLifetimeScope("Run2948")) { var testServiceA11 = scope1.Resolve (); using (var scope2 = container.BeginLifetimeScope()) { var testServiceA12 = scope2.Resolve (); Console.WriteLine(object.ReferenceEquals(testServiceA11,testServiceA12)); } testServiceA15 = testServiceA11; } using (var scope1 = container.BeginLifetimeScope("Run2948")) { var testServiceA13 = scope1.Resolve (); using (var scope2 = container.BeginLifetimeScope()) { var testServiceA14 = scope2.Resolve (); Console.WriteLine(object.ReferenceEquals(testServiceA13,testServiceA14)); } testServiceA16 = testServiceA13; } Console.WriteLine(object.ReferenceEquals(testServiceA15,testServiceA16));
InstancePerOwned : 在一个所拥有的实例创建的生命周期中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;(较少使用)
InstancePerHttpRequest : 同一次Http请求上下文中,每次调用,都会使用同一个实例化的对象;每次都用同一个对象;仅适用于 ASP.NET (CORE) MVC 或 WebForm 应用程序
Autofac 支持配置文件
- 安装 NuGet 程序包:
Autofac.Extensions.DependencyInjection 7.1.0、Autofac.Configuration 6.0.0 - 新建配置文件(指定接口和实现的对应关系)
autofac.json:
{ "components":[ { "type: "One.Services.TestServiceA,One", "services": [ { "type": "One.Services.ITestServiceA,One" } ], "instanceScope": "single-instance", "injectProperties": true }, { "type: "One.Services.TestServiceB,One", "services": [ { "type": "One.Services.ITestServiceB,One" } ], "instanceScope": "single-instance", "injectProperties": true }, { "type: "One.Services.TestServiceC,One", "services": [ { "type": "One.Services.ITestServiceC,One" } ], "instanceScope": "single-instance", "injectProperties": true }, { "type: "One.Services.TestServiceD,One", "services": [ { "type": "One.Services.ITestServiceD,One" } ], "instanceScope": "single-instance", "injectProperties": true } ] }- 读取配置文件,完成服务对应关系的注册
var builder = new ContainerBuilder(); var config = new ConfigurationBuilder(); var configSource = new JsonConfigurationSource() { Path = "Config/autofac.json", Optional = false, ReloadOnChange = true }; config.Add(configSource); var configModule = new ConfigurationModule(config.Build()); builder.RegisterModule(configModule); var container = builder.Build(); // 获取服务实例 var testServiceA = container.Resolve(); var testServiceD = container.Resolve(); testServiceD.Show(); - 新建 ITestServiceA 的新版实现类
TestServiceUpdate
提示:
本文由神整理自网络,如有侵权请联系本站删除!
本站声明:
1、本站所有资源均来源于互联网,不保证100%完整、不提供任何技术支持;
2、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!
相关内容
- Ubuntu16.04系统搭建.Net Core开发环境_实用技巧_
- ASP.NET Core扩展库ServiceStack.Redis用法介绍_实用技巧_
- ASP.NET Core在WebApi项目中使用MiniProfiler分析Entity Framework Core_实用技巧_
- ASP.NET Core使用MiniProfiler分析应用_实用技巧_
- ASP.Net Core基于EF6、Unitwork、Autofac实现Repository模式_实用技巧_
- ASP.NET Core快速入门教程_基础应用_
- ASP.NET Core使用NLog输出日志记录_实用技巧_
- MAUI项目中使用SnackBar与Toast通知功能_实用技巧_
- Prism区域管理器IRegionManager用法介绍_实用技巧_
- MAUI中实现构建跨平台原生控件_实用技巧_
点击排行
本栏推荐
