可用依賴注入的類庫很多,這里拿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);
}