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

猜你喜欢

转载自www.cnblogs.com/LoveTomato/p/9285325.html