Autofac注入方式
Autofac注入方式
前面一节介绍了Autofac,这节介绍Autofac的注入方式。
环境
Win10+VS2020+.NET 5.0 +Autofac 6.3.0
Autofac三种注入方式
l 构造函数注入
l 属性注入
l 方法注入
实践
项目结构
在上节Autofac的快速入门的项目上改造。
添加ITestServiceB 和 TestServiceB
public interface ITestServiceB { void Show(); } public class TestServiceB : ITestServiceB { private ITestServiceA _testServiceA;
public TestServiceB() { Console.WriteLine($"{this.GetType().Name} 被构造了..."); } public void SetService(ITestServiceA testServiceA) { _testServiceA = testServiceA; }
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 { private ITestServiceA _testServiceA; public TestServiceC(ITestServiceA iTestServiceA) { _testServiceA = iTestServiceA; Console.WriteLine($"{this.GetType().Name} 被构造了..."); }
public void Show() { _testServiceA.Show(); Console.WriteLine($"This is a {this.GetType().Name} Instance..."); } } |
添加ITestServiceD 和 TestServiceD
public interface ITestServiceB { 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<TestServiceA>().As<ITestServiceA>(); builder.RegisterType<TestServiceC>().As<ITestServiceC>(); var container = builder.Build(); // 获取服务实例 var testService = container.Resolve<ITestServiceC>(); testService.Show(); |
运行:
属性注入
提供属性的服务,注册时候必须使用PropertiesAutowired方法。
var builder = new ContainerBuilder(); builder.RegisterType<TestServiceA>().As<ITestServiceA>(); builder.RegisterType<TestServiceD>().As<ITestServiceD>().PropertiesAutowired(); var container = builder.Build(); // 获取服务实例 var testService = container.Resolve<ITestServiceD>(); testService.Show(); |
方法注入
提供方法注入,需要在注册服务的时候,使用OnActivated方法。
var builder = new ContainerBuilder(); builder.RegisterType<TestServiceA>().As<ITestServiceA>(); builder.RegisterType<TestServiceB>().OnActivated(e => e.Instance.SetService(e.Context.Resolve<ITestServiceA>()) ).As<ITestServiceB>(); var container = builder.Build();
// 获取服务实例 var testService = container.Resolve<ITestServiceB>(); testService.Show(); |
运行:
总结
通过构造函数传入接口进行获取实例,该方法可以极大减少构造函数传入的实例过多所导致的构造函数参数臃肿。
本文来自博客园,作者:{春光牛牛,yak},转载请注明原文链接:https://www.cnblogs.com/yakniu/p/16271185.html
欢迎各位大佬们评论指正
QQ讨论群:610129902
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY