您现在的位置是:网站首页> 编程资料编程资料

.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、本站所发布的文章以及附件仅限用于学习和研究目的;不得将用于商业或者非法用途;否则由此产生的法律后果,本站概不负责!

-六神源码网