加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

Autofac依赖注入应用

发布时间:2020-12-14 05:06:51 所属栏目:百科 来源:网络整理
导读:可用依赖注入的类库很多,这里拿github最火的 Autofac 为例介绍使用方法。这里以上篇博客为例运用设计原则编写可测试性的代码 Autofac思想介绍 Autofac 为我们提供一容器,我们先将类型注册到容器中,在需要时通过服务直接取类型对象。 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项目

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读