zoukankan      html  css  js  c++  java
  • Autofac

    上一篇中, 留了一个小问题,在一个接口下面, 注册多个类, 并能正常获取. 之前的方式是不能做到的, 在服务中, 有一种实现方式是可以的.

    一、服务

    1. 类型 - 描述服务的基本方法

    上一篇其实使用到过这种方式, 只是并没有拿出来讲.

    builder.RegisterType<Dog>().As<IAnimal>();
    
    //-------------------------------------------------
    var animal = container.Resolve<IAnimal>();
    animal.Say();

    这个方法, 就可以将IAnimal类型的服务与Dog的组件连接起来. 通过这个服务, 可以创建Dog的实例. 

    按照类型的服务在自动装配中, 也是管用的.

    2. 别名

    builder.RegisterType<Dog>().Named<IAnimal>("dog");
    builder.RegisterType<Cat>().Named<IAnimal>("cat");
    //-------------------------------------------------
    var dog = container.ResolveNamed<IAnimal>("dog");
    dog.Say();
    Console.WriteLine();
    var cat = container.ResolveNamed<IAnimal>("cat");
    cat.Say();

    从此方式来看, 是可以实现之前功能的. 在同一个接口下面, 注册多个类, 并正常获取他们的实体

    Named方法, 本质上还是调用的As()方法

    别名的方式, 有些宽泛, 这里我想怎么写都行, 没有什么约束(规范), 更不知道里面有些什么. 使用起来, 有些不是很方便.

    对于这一点, autofac也是考虑到了的, 所以提供了另一种方式.

    3. 键

    首先建一个让人能看懂的枚举

    public enum AnimalEnum
    { 
        Dog,
        Cat
    }

    有了这个实体之后, 就能知道, IAnimal服务下面, 可以注册那些类, 可以获取到那些类的实体

    builder.RegisterType<Dog>().Keyed<IAnimal>(AnimalEnum.Dog); 
    builder.RegisterType<Cat>().Keyed<IAnimal>(AnimalEnum.Cat);
    //-------------------------------------------------
    var dog = container.ResolveKeyed<IAnimal>(AnimalEnum.Dog);
    dog.Say();
    Console.WriteLine();
    var cat = container.ResolveKeyed<IAnimal>(AnimalEnum.Cat);
    cat.Say();

    Keyed<>()方法, 和Named<>()方法一样, 都是调用As()方法, 只是对值的限制有些不同.

    从结果看, 与别名的方式, 是一样的. 不过有利就有弊, 虽然能清晰看到可用的类, 但是在扩展性上就差了一些, 如果你想新增一个类进去, 就得修改AnimalEnum枚举值. 

    除了上面两种获取方式之外, 还有一种Index索引的获取方式.

    var iindex = container.Resolve<IIndex<string, IAnimal>>();
    var cat = iindex["cat"];
    cat.Say();
    
    var index = container.Resolve<IIndex<AnimalEnum, IAnimal>>();
    var dog = index[AnimalEnum.Dog];
    dog.Say();

    注册部分, 是跟之前是一样的, 只是取的时候不一样. 当不知道iindex["cat"]中, "cat"的具体值时, 这里报错几率会增加不少. 所以, 推荐还是使用下面枚举的那种

    4. 遍历方式

    builder.RegisterAssemblyTypes(Assembly.GetExecutingAssembly()).AsImplementedInterfaces();
    //-------------------------------------------------
    var list = container.ComponentRegistry.Registrations.ToList();
    var s = container.ResolveComponent(list[3], new List<Parameter>()) as Dog;
    s.Say();

    这里我首先注册当前运行的程序集, 然后, 通过Registrations获取到, 所有注册了的类型, 之后应该遍历这些类型, 找到你想要的,

    然后调用ResolveComponent方法, 去获取实例. 这里我省懒了(某人比较懒), 哈哈. 此方式不推荐使用

    参考:

     Autofac 组件、服务、自动装配 《第二篇》

     Autofac文档

  • 相关阅读:
    2018-2019-2 20175202实验三《敏捷开发与XP实践》实验报告
    20175202 葛旭阳 MyCP
    20175202 《Java程序设计》第九周学习总结
    20175202 《Java程序设计》第八周学习总结
    2018-2019-2 20175202实验二《Java面向对象程序设计》实验报告
    20175202 结对编程练习—四则运算(第一周)
    20175203 2018-2019 实验三 《敏捷开发与XP实践》
    2018-2019-20175203 实验二 《Java面向对象程序设计》
    20175203 2018-2019-2 实验一《Java开发环境的熟悉》实验报告
    20175203 2018-2019-2《Java程序设计》第五周学习总结
  • 原文地址:https://www.cnblogs.com/elvinle/p/6169776.html
Copyright © 2011-2022 走看看