前进中的蜗牛

番茄大叔

水滴穿石,非一日之功;没有量变,何来质变。

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项目

下载

posted @ 2018-07-09 18:45  LoveTomato  阅读(1750)  评论(0编辑  收藏  举报