zoukankan      html  css  js  c++  java
  • 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项目

    下载

  • 相关阅读:
    DIV切换
    打开文件
    修改config配置文件
    soapui安装和破解教程
    URL文件保存到本地
    业务gis 怎么让别的开发人员不需要懂gis就可以搞开发? (三)
    业务gis 怎么让别的开发人员不需要懂gis就可以搞开发? (二)
    业务gis 怎么让别的开发人员不需要懂gis就可以搞开发? (一)
    合并的地块带有小缝隙怎么办
    flex polygon 序列化为txt 文本
  • 原文地址:https://www.cnblogs.com/LoveTomato/p/9285325.html
Copyright © 2011-2022 走看看