autofac的小知识点

autofac 注入中i遇到的泛型传参问题


1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

79

using Autofac;

using IService;

using System;

using System.Collections.Generic;

using System.Linq;

using System.Reflection;

using System.Text;

using System.Threading.Tasks;

using TT.Service.Interface;

using TT.Service.Realize;

namespace InjectionServer

{

    public class Dependency

    {

        public static Assembly Assemblys { setget; } = Assembly.Load("TT.Service");

        static Dependency()

        {

            if (Builder == null)

            {

                Builder = new ContainerBuilder();//初始化容器

                Builder.RegisterAssemblyTypes(Assemblys)

                .Where(o => o != typeof(IRepository<>))

                .AsImplementedInterfaces().PropertiesAutowired().InstancePerDependency();

                InstanceContainer = Builder.Build();

            }

        }

        public Dependency()

        {

            var type = this.GetType();

            foreach (var item in type.GetProperties(BindingFlags.Public | BindingFlags.Instance))

            {

                try

                {

                    string key = "TT.Service.Interface." + $"I{item.Name.Replace("Example", "")}";

                    Type t = Assemblys.GetType(key);

                    var method = type.GetMethod("GetInstance", BindingFlags.Static | BindingFlags.NonPublic)

                                                  .MakeGenericMethod(t);

                    item.SetValue(this, method.Invoke(nullnull));

                }

                catch (Exception ex)

                {

                    Console.WriteLine(ex.Message);

                }

            }

        }

        /// <summary>

        /// 取出对象管理

        /// </summary>

        internal static IContainer InstanceContainer { getset; }

        /// <summary>

        /// 注册对象管理

        /// </summary>

        internal static ContainerBuilder Builder { getset; }

        internal static T GetInstance<T>()

            where T : class

        {

                var instance = InstanceContainer.Resolve<T>();

                return instance;

        }

        internal static void Register<T, K>()

                where T : class

                where K : class

        {

            Builder.RegisterType<T>().As<K>().PropertiesAutowired().InstancePerDependency();

        }

        public IUsers UsersExample { setget; }

        public ITest TestExample { setget; }

    }

}

  

之前的代码

 1 using Autofac;
 2 using IService;
 3 using System;
 4 using System.Collections.Generic;
 5 using System.Linq;
 6 using System.Reflection;
 7 using System.Text;
 8 using System.Threading.Tasks;
 9 using TT.Service.Interface;
10 using TT.Service.Realize;
11
12 namespace InjectionServer
13 {
14     public class Dependency
15     {
16          static Dependency()
17         {
18             if (Builder == null)
19             {
20                 Builder = new ContainerBuilder();
21                 Register();
22                 InstanceContainer = Builder.Build();
23             }
24         }
25
26         #region 容器管理
27         /// <summary>
28         /// 取出对象管理
29         /// </summary>
30         internal static IContainer InstanceContainer { get; set; }
31
32         /// <summary>
33         /// 注册对象管理
34         /// </summary>
35         internal static ContainerBuilder Builder { get; set; }
36
37         /// <summary>
38         /// 获取指定接口的实例
39         /// </summary>
40         /// <typeparam name="T"></typeparam>
41         /// <returns></returns>
42         internal static T GetInstance<T>()
43             where T : class
44         {
45             var instance = InstanceContainer.Resolve<T>();
46             return instance;
47         }
48
49         /// <summary>
50         /// 注册并且设置为在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。
51         /// </summary>
52         /// <typeparam name="T"></typeparam>
53         /// <typeparam name="K"></typeparam>
54         /// <param name="t"></param>
55         /// <param name="k"></param>
56         internal static void Register<T, K>()
57              where T : class
58              where K : class
59         {
60             Builder.RegisterType<T>().As<K>().PropertiesAutowired().InstancePerDependency();
61         }
62         #endregion
63
64         #region 容器注册
65         internal static void Register()
66         {
67
68
69             Register<UserService, IUserService>();
70             //Register<UserService, IUserService>();
71             //Register<UserService, IUserService>();
72
73         }
74         #endregion
75
76         public IUsers UsersExample {  get { return GetInstance<IUsersService>(); } }
77
78
79     }
80 }

时间: 2024-08-12 22:24:27

autofac的小知识点的相关文章

记录神经网络中一些小知识点

记录神经网络中一些小知识点 1 Caffe中的blob维度 Caffe中的blob具有4个维度,分别是num,channel,width和height: 其中我们在定义各个网络层时,常用到的一个参数numout,就是指定的channel: 比如说,维度为1*3*5*5的数据输入网络(即每次输入一张5*5大小的3通道图),经过一个stride为2,pad为1,kernel为2,numout为2的卷积层后,维度就变成了1*2*3*3: 假如输入有n个通道,计算时,caffe就会对应产生n个filte

C++ 小知识点 WINAPI

int WINAPI WINMain 中,WINAPI含义 网友给出回答:在windef.h头文件中有如下定义#define WINAPI      __stdcall#define APIENTRY    WINAPIVC有两种函数调用方式 一种是__stdcall,另一种是__cdecl函数的调用方式有两种一种是PASCAL调用方式,另一种是C调用方式使用PASCAL调用方式,函数在返回到调用者之前将参数从栈中删除使用C调用方式,参数的删除是调用者完成的WinMain函数是由系统调用的,Wi

0607am抽象类&amp;接口&amp;析构方法&amp;tostring&amp;小知识点

/*class ren{ public static $color;//静态 static function () { ren::$color; self::$color;//self只能写在类里面,代表这分类 }} */ //不能实例化的类:抽象类abstract class Animal //关键字abstract{ public $dong; public $jiao; function chi() { } function shui() { }}class Ren extends Ani

初学MySQL中的一些小知识点

写在前面,小弟初用博客记录学习路上的一点点小知识点,其中可能有个人理解方面的误差,或不明白的地方.希望各位大牛纠正指导,小弟感激不尽!这并不是什么帮助别人解决问题的文章,只是小弟将学习到的内容一一写在博客上,这样方便以后复习,还恳请大家勿喷.. 一.进入MySQL客户端 1.客户端可以通过.../MySQL/bin目录下的sql.exe运行客户端. 1.1:访问方式一: -u root -p /*可以直接在这段代码的后面添加密码,也可以按回车后再输入密码*/ 1.1:访问方式二: --host

私人定制javascript中数组小知识点(Only For Me)

先上笑话,1.刚看到一个游泳的,想起公司组织去三亚旅游,老板跳海里,各种挣扎,捞上来老板第一句话:我记得我会游泳的啊. 2.媳妇说:老公对不起,我把你新买的自行车撞散架了! 老公:没事宝贝,你若安好,便是晴天! 媳妇说:老公你太有诗意了. 老公:滚犊子,安不好我整死你! 数组的概念 javascript数组是值得有序集合,不过它实属一个javascript对象的特殊形式,这是一个很重点的定性. 创建数组 1.var a=new Array();//等同于[] 2.var a=new Array(

js中关于value的一个小知识点(value既是属性也是变量)

今天在学习input的value值时,发现这么一个小知识点,以前理解不太透彻. [1]以下这种情况,是常见的情况,会弹出“测试内容” <input type="button" value="测试内容" onclick = "alert(value)"> [2]心想,这种情况下value找不到,作用域链应该到document了,应该弹出“123",但情况是弹出空 <script> var value=123; &l

琐碎的小知识点

一.asp.net 1.点击Repeater中的LinkButton,获取当中label中的值:     Label lblName = ((LinkButton )sender).Parent.FindControl("lblName") as Label ;或者在gridView中,添加按钮列ButtonFlied并转化为模板时,设置LinkButton的.CommandArgument为绑定值,再根据 string n= ((LinkButton)sender).CommandA

一个关于echo的小知识点

一个关于echo的小知识点     echo一个布尔值时,如果是true,输出1,而如果是false,将什么都不输出! 网上搜的一个解释: 对于数字类型来说,false 确实 是 0, 而对string来说,false是 空,虽然数字的0也等于字符串的空,但是不能说 bool 转换 string 以后就是 0: var_dump((int)false);var_dump((string)false);

复习正则表达式时的一个小知识点

复习正则表达式时的一个小知识点     当分组后,若要引用此小组内容可以有两种方式 1:用 ${1} 2:用 \1 两者效果是一样的