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

    下载

  • 相关阅读:
    浏览器缓存
    HTML学习笔记(九) Web Socket
    [转]maven2中snapshot快照库和release发布库的区别和作用
    [转]maven2中snapshot快照库和release发布库的应用
    CentOS 7 mini 试用笔记
    Windows找出占用端口的进程
    ORA-24408: could not generate unique server group name
    Oracle中NVL、NVL2、NULLIF 三个函数的区别?
    【代码大全-读书笔记】第1章 欢迎进入软件构建的世界
    【代码大全-读书笔记】前言
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9285325.html
Copyright © 2020-2023  润新知