可用依赖注入的类库很多,这里拿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);
}