Autofac依赖注入应用
可用依赖注入的类库很多,这里拿github最火的Autofac
为例介绍使用方法。这里以上篇博客为例运用设计原则编写可测试性的代码
Autofac思想介绍
Autofac
为我们提供一容器,我们先将类型注册到容器中,在需要时通过服务直接取类型对象。Autofac
提供了多种注册方式,而且方便集成到项目中。
Autofac注入方法
类型注册方法
/*
* 第一种注册方式:RegisterType对ProductService类型注册,注册的类型可用通过Resolve得到ProductService实例
* builder.RegisterType<ProductRepository>().As<IProductRepository>();通过As可用让ProductService类通过构造函数依赖注入相应的的接口
* Build()方法返回Container实例
*/
var builder = new ContainerBuilder();
builder.RegisterType<ProductService>();
builder.RegisterType<DictionaryCacheStorage>().As<ICacheStorage>();
builder.RegisterType<ProductRepository>().As<IProductRepository>();
Container = builder.Build();
取对象方法var productService = Container.Resolve<ProductService>();
通过配置文件注入
//第二中通过json配置文件注入
var builder = new ContainerBuilder();
builder.RegisterType<ProductService>();
builder.RegisterType<DictionaryCacheStorage>().As<ICacheStorage>();
var config = new ConfigurationBuilder();
config.AddJsonFile("autofac.json");
var module = new ConfigurationModule(config.Build());
builder.RegisterModule(module);
Container = builder.Build();
注意这里需引用包Autofac
、Autofac.Configuration
、Microsoft.Extensions.Configuration
、Microsoft.Extensions.Configuration.Json
通过Module注入
这种注入更灵活,可以写入逻辑
- 新进实现
Module
的类
public class ProduceServiceModule : Module
{
protected override void Load(ContainerBuilder builder)
{
builder.RegisterType<ProductService>();
var config = new ConfigurationBuilder();
config.AddJsonFile("autofac.json");
var module = new ConfigurationModule(config.Build());
builder.RegisterModule(module);
}
}
- 注入模块
//3 模块注册,可以控制注入逻辑
var builder = new ContainerBuilder();
builder.RegisterType<DictionaryCacheStorage>().As<ICacheStorage>();
builder.RegisterModule(new ProduceServiceModule());
Container = builder.Build();
通过unit test 构建单元测试
[TestClass]
测试特性[TestInitialize]
测试类初始化[TestMethod]
测试放过- 断言测试结果的成败
Assert
[TestMethod]
public void Test_Find_Product_by_CategoryName_Hats()
{
IList<Product> products;
//每次请求得到一个新的实例,如不使用两个方法得到的实例相同
using (var scope = Container.BeginLifetimeScope())
{
var productService = Container.Resolve<ProductService>();
string categoryName = "Hats";
products = productService.GetAllProductsIn(categoryName);
}
Assert.AreEqual<int>(3,products.Count);
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!