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

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 { set; get; } = 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(null, null));
                }
                catch (Exception ex)
                {
                    Console.WriteLine(ex.Message);
                }
            }
        }

        /// <summary>
        /// 取出对象管理
        /// </summary>
        internal static IContainer InstanceContainer { get; set; }

        /// <summary>
        /// 注册对象管理
        /// </summary>
        internal static ContainerBuilder Builder { get; set; }

        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 { set; get; }

        public ITest TestExample { set; get; }
    }
}

  

之前的代码

 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-10-25 02:36:30

autofac 注入中i遇到的泛型传参问题的相关文章

(九)shell中case语句、程序传参、while

2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中的switch case不同.shell中的case默认就是匹配上哪个执行哪个,不会说执行完了还去执行后面的其他case(就好像shell中的case语言默认都带了break). 2.2.6.2.调用shell程序的传参(1)C语言中可以通过main函数的argc和argv给程序传参(详情参考<4.

linux中模块的构建,传参,和printk函数的简单使用

静态编译,动态加载应用想访问内核需要通过系统调用 驱动:1.模块(打包,加入内核)2.内核机制3.操作硬件 在Kconfig里面配置menuconfig的时候,不同的类型会在图形化界面的终端显示不用的配置选项:bool CONFIG_HELLO []hello_driver 两态tristate CONFIG_HELLO <>hello_driver 三态的 空 * Mstring/int CONFIG_HELLO ()hello_driver 相当于宏替换 (dest)hello_drive

mysql中ibatis的limit动态传参

param.put("pageNo",pageNo);   param.put("pageSize",pageSize); sqlMap中的用法 limit ${pageNo},${pageSize} 我今天在敲代码的时候这么用结果就报错了:limit #pageNo#,#pageSize# 后来查资料才知道 limit 后面不应该用#(我传进来的是Integer),而应该用$, #与$的区别. (一般能用#的就别用$. ) #是把传入的数据当作字符串,如#page

React 版本16.9.0 中配置路由以及路由传参

我的脚手架版本如下: "dependencies": { "antd": "^3.21.4", "jquery": "^3.4.1", "lodash": "^4.17.15", "react": "^16.9.0", "react-dom": "^16.9.0", "react

SpringCloud中服务消费者接受前台传参问题(报错415)

服务消费者clientFeign,接受前台form表单post提交的数据,虽然传递参数是对象类型,但是后台不能添加@RequestBody注解!!!,form表单提交的数据不是json格式!!! 1. 前端 <form class="layui-form" action="/menu/save" method="post"> <div class="layui-form-item"> <label

uboot移植之tag传参

1:什么是tag (1)tag是一种数据结构,用于uboot向内核传递参数,一个tag代表了一个参数,uboot在向kernel传参时,就是通过一个个tag来实现的. (2)每个tag都有一个tag_header(一个结构体),包含了tag的类型和大小,然后tag中剩余的部分tag_xxx来当作传参的tag 2:kernel如何知道tag的起始地址. uboot启动内核的最后通过theKernel (0, machid, bd->bi_boot_params);来启动内核,这三个参数,第一个固定

action之间传参为中文;type=&#39;redirect&#39;和 type=&#39;redirectAction&#39;主要区别

摘录自:http://blog.csdn.net/lhi705/article/details/7446156 [html] view plain copy print? Struts2中action之间传参中文乱码的问题 解决方法一(已经验证,可以): 两个action都定义要传的参数属性的get和set方法,必须相同! 在struts.xml中定义: <result name="input" type="redirect"> <param na

c/c++ 数组传参

在c/c++中,在进行数组传参时,数组的元素个数默认是不作为实参传入调用函数,也就是说c/c++ 不允许向函数传递一个完整的数组作为参数 实例: 1.形式参数是一个指针,实参包括数组长度: 1 void myFunction(int *param,int length){ 2 for (int i = 0; i<length - 1; i++) 3 { 4 cout << param[i] << "\t"<<endl; 5 } 6 } 2.形式

vue 路由传参 params 与 query两种方式的区别

初学vue的时候,不知道如何在方法中跳转界面并传参,百度过后,了解到两种方式,params 与 query.然后,错误就这么来了:  router文件下index.js里面,是这么定义路由的: { path:"/detail", name:"detail", component:home } 我想用params来传参,是这么写的,嗯~ this.$router.push({ path:"/detail", params:{ name:'nameV