• 依赖注入之AutoFac


    一 、IoC框架AutoFac简介

      IoC即控制反转(Inversion of Control),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递给它。也可以说,依赖被注入到对象中。

      控制反转背后的核心思想是, 我们不再将类绑定在应用里,让类自己去 "new up" 他们的依赖, 而是反过来在类的构造方法中将依赖传递进去,而类的创建工作统一交给容器Container处理. 

    二 、Autofac使用的基本流程

    • 按照 控制反转 (IoC) 的思想构建你的应用.
    • 添加Autofac引用.
    • 在应用的 startup 处...
    • 创建 ContainerBuilder.
    • 注册组件.
    • 创建容器,将其保存以备后续使用.
    • 从容器中创建一个生命周期.
    • 在此生命周期作用域内解析组件实例.

    三 、Autofac术语

    TermMeaning
    Activator(激活器) 注册 中的一部分, 提供一个 上下文 和一组 参数, 可以创建一个绑定于该 上下文 的 组件实例
    Argument(形参) 一个构造函数的 .NET 类型形参
    Component(组件) 一串声明了它所提供 服务 和它所消费 依赖 的代码
    Instance(实例) 通过 Activating(激活) 一个在 容器 (也可以是 组件实例 )中提供 服务 的 组件 , 来获得的一个.NET对象
    Container(容器) 管理组成应用的 组件 的一种结构
    Context(上下文) 一块界定的区域, 在其中特定的一组 服务 是可用的
    Dependency(依赖) 一个被 组件 需要的 服务
    Lifetime(生命周期) 从 实例 的 激活 到 释放 的持续时间
    Parameter(实参) 用来配置一个 组件 的非 服务 对象
    Registration(注册) 添加和配置 组件 到 容器 的行为, 和与此过程相关的信息
    Scope(作用域) 一个特定的 上下文 , 在其中 组件 的 实例 将会被其他 组件 依据它们的 服务 所共享
    Service(服务) 一个在提供和消费 组件 之间明确定义的行为约定

    四 、Autofac使用简单举例

      写代码前首先将Autofac的引用添加进项目,可以从NuGet上直接下载;

      以下代码演示了注册Pig及Person类及对应IAnimal,Person和IPerson服务到容器中,然后调用Person服务的解析(相当于实例化),最后成功调用Person的给动物喂食的方法FeedAnimal

    using System;
    
    namespace AutoFacTest
    {
        public interface IAnimal
        {
            void Eat();
    
            void Run();
        }
    
        public class Pig : IAnimal
        {
            public void Eat()
            {
                Console.WriteLine("pig eat");
            }
    
            public void Run()
            {
                Console.WriteLine("pig run");
            }
        }
    
        public interface IPerson
        {
            void FeedAnimal();
        }
    
        public class Person : IPerson
        {
            IAnimal ianimal;
    
            public Person(IAnimal animal)
            {
                this.ianimal = animal;
            }
    
            public void FeedAnimal()
            {
                ianimal.Eat();
            }
        }
    }
    using Autofac;
    
    namespace AutoFacTest
    {
        class Program
        {
            private static IContainer Container { get; set; }
            static void Main(string[] args)
            {
                // 创建容器
                var builder = new ContainerBuilder();
                // 注册组件并暴露相应服务
                // 注册Pig类,将IAnimal作为服务
                builder.RegisterType<Pig>().As<IAnimal>();
    
                // 注册Person类,将Person及IPerson作为服务
                builder.RegisterType<Person>().AsSelf().As<IPerson>();
                
                //直接构建容器
                using (Container = builder.Build())
                {
                    // 通过注册的IPerson服务创建Person解析(相当于实例化)
                    var person = Container.Resolve<IPerson>();
                    person.FeedAnimal();
                }
                //有时在我们的应用中也许可以从根容器中解析组件, 然而这么做有可能会导致内存泄漏.所以还可以
                //using (var scope = container.BeginLifetimeScope())
                //{
                //    var service = scope.Resolve<IPerson>();
                //}
            }
    
        }
    }

    五 、常用方法

    1. builder.RegisterType<Object>().As<Iobject>():注册类型及其实例。

    2. IContainer.Resolve<IDAL>():解析某个接口的实例。

    3. builder.RegisterType<Object>().Named<Iobject>(string name):为一个接口注册不同的实例。有时候难免会碰到多个类映射同一个接口,比如SqlDAL和OracleDAL都实现了IDAL接口,为了准确获取想要的类型,就必须在注册时起名字。

    4. IContainer.ResolveNamed<IDAL>(string name):解析某个接口的“命名实例”。例如上面的最后一行代码就是解析IDAL的命名实例OracleDAL

    5. builder.RegisterType<Object>().Keyed<Iobject>(Enum enum):以枚举的方式为一个接口注册不同的实例。

    6. IContainer.ResolveKeyed<IDAL>(Enum enum):根据枚举值解析某个接口的特定实例。

    7. builder.RegisterType<Worker>().InstancePerDependency():用于控制对象的生命周期,每次加载实例时都是新建一个实例,默认就是这种方式

    8. builder.RegisterType<Worker>().SingleInstance():用于控制对象的生命周期,每次加载实例时都是返回同一个实例

    9. IContainer.Resolve<T>(NamedParameter namedParameter):在解析给实例T时传参

    参考:https://www.cnblogs.com/WeiGe/p/3871451.html

       https://autofaccn.readthedocs.io/zh/latest/getting-started/index.html

  • 相关阅读:
    Arrays.asList的使用
    php之sql语句 创建数据库、表、插入字段,自动判断是否成功
    初识 canvas 绘图
    自定义音频audio播放器
    我的晨练
    js获取屏幕或可视范围
    js 查看脚本运行时间的办法
    a:hover伪类在ios移动端浏览器内触发无法取消
    js模拟用户触摸事件
    持续健身带来的变化
  • 原文地址:https://www.cnblogs.com/xieyang07/p/10322348.html
Copyright © 2020-2023  润新知