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();

注意這里需引用包AutofacAutofac.ConfigurationMicrosoft.Extensions.ConfigurationMicrosoft.Extensions.Configuration.Json

通過Module注入

這種注入更靈活,可以寫入邏輯

  1. 新進實現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);
		}
	}
  1. 注入模塊
//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);
		}

結尾

下篇介紹Autofac集成webform和mvc項目

下載


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM