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; }
}
}

  

之前的代码

 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
{
static Dependency()
{
if (Builder == null)
{
Builder = new ContainerBuilder();
Register();
InstanceContainer = Builder.Build();
}
} #region 容器管理
/// <summary>
/// 取出对象管理
/// </summary>
internal static IContainer InstanceContainer { get; set; } /// <summary>
/// 注册对象管理
/// </summary>
internal static ContainerBuilder Builder { get; set; } /// <summary>
/// 获取指定接口的实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns></returns>
internal static T GetInstance<T>()
where T : class
{
var instance = InstanceContainer.Resolve<T>();
return instance;
} /// <summary>
/// 注册并且设置为在一个生命周期域中,每一个依赖或调用创建一个单一的共享的实例,且每一个不同的生命周期域,实例是唯一的,不共享的。
/// </summary>
/// <typeparam name="T"></typeparam>
/// <typeparam name="K"></typeparam>
/// <param name="t"></param>
/// <param name="k"></param>
internal static void Register<T, K>()
where T : class
where K : class
{
Builder.RegisterType<T>().As<K>().PropertiesAutowired().InstancePerDependency();
}
#endregion #region 容器注册
internal static void Register()
{ Register<UserService, IUserService>();
//Register<UserService, IUserService>();
//Register<UserService, IUserService>(); }
#endregion public IUsers UsersExample { get { return GetInstance<IUsersService>(); } } }
}

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

  1. vue-cli项目中使用全局过滤器及传参(日期格式化)

    // 过滤日期格式,传入时间戳,根据参数返回不同格式 const formatTimer = function(val, hours) { if (val) { ); var y = dateTime ...

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

    静态编译,动态加载应用想访问内核需要通过系统调用 驱动:1.模块(打包,加入内核)2.内核机制3.操作硬件 在Kconfig里面配置menuconfig的时候,不同的类型会在图形化界面的终端显示不用的 ...

  3. (二)shell中case语句、程序传参、while

    2.2.6.1.case语句(1)shell中的case语句和C语言中的switch case语句作用一样,格式有差异(2)shell中的case语句天生没有break,也不需要break,和C语言中 ...

  4. 从字节码看java中 this 的隐式传参

    从字节码看java中 this 隐式传参具体体现(和python中的self如出一辙,但是比python中藏得更深),也发现了 static 与 非 static 方法的区别所在! static与非s ...

  5. MVC中学到的小知识(MVC中的跳转,传参)

    1.mvc中视图中的href="XXX",这个XXX是控制器地址,不是另一个视图.(这里的href语句只能转向控制器,不能直接转向视图),如果要实现转向视图,可以先转到控制器,然后 ...

  6. c++11中关于`std::thread`线程传参的思考

    关于std::thread线程传参的思考 最重要要记住的一点是:参数要拷贝到线程独立内存中,不管是普通类型.还是引用类型. 对于传递参数是引用类型,需要注意: 1.当指向动态变量的指针(char *) ...

  7. js中关于带数字类型参数传参丢失首位数字0问题

    最近在项目中遇到一个问题,js中传带有数字的参数时,如果参数开头有数字0,会把0给去掉. 例如: 方法abc(0123456,789); 方法abc中获取的参数0123456就会变为123456. 原 ...

  8. Mybatis中使用 #{} 和 ${} 向sql传参时的区别

    今天在工作时,使用MyBatis中向sql传递两个参数时,一直显示SQL语法错误,仔细检查,才发现传入的参数被加上了引号,导致传入的参数(要传入的参数是表名)附近出现语法错误. 错误写法: } a } ...

  9. mysql中ibatis的limit动态传参

    param.put("pageNo",pageNo);   param.put("pageSize",pageSize); sqlMap中的用法 limit $ ...

随机推荐

  1. 连接池技术 Connection Pooling

    原创地址:http://www.cnblogs.com/jfzhu/p/3705703.html 转载请注明出处 和数据库建立一个物理连接是一个很耗时的任务,所以无论是ADO.NET还是J2EE都提供 ...

  2. IOS Animation-CABasicAnimation、CAKeyframeAnimation详解&区别&联系

    1.先看看网上流传的他们的继承图: 从上面可以看出CABasicAnimation与CAKeyframeAnimation都继承于CAPropertyAnimation.而CAPropertyAnim ...

  3. Java对象序列化---转载

    1.概念 序列化:把Java对象转换为字节序列的过程. 反序列化:把字节序列恢复为Java对象的过程. 2.用途 对象的序列化主要有两种用途: 1) 把对象的字节序列永久地保存到硬盘上,通常存放在一个 ...

  4. Kafka与Logstash的数据采集对接 —— 看图说话,从运行机制到部署

    基于Logstash跑通Kafka还是需要注意很多东西,最重要的就是理解Kafka的原理. Logstash工作原理 由于Kafka采用解耦的设计思想,并非原始的发布订阅,生产者负责产生消息,直接推送 ...

  5. Java面试(3)-- Java关系运算符

    class Demo03{ public static void main(String[] args){ //关系运算符 == //例1 int a = 10; int b = 10; double ...

  6. ViewPager 的页面重置问题

    当我们使用ViewPager控件时,假设我们的ViewPager有三页,当我们第一次启动ViewPager显示第一页的时候,ViewPager会预加载第二页,这样当我们向第二页滑动的时候就可以看见第二 ...

  7. C# 开发2048小游戏

    这应该是几个月前,闲的手痒,敲了一上午代码搞出来的,随之就把它丢弃了,当时让别人玩过,提过几条更改建议,但是时至今日,我也没有进行过优化和更改(本人只会作案,不会收场,嘎嘎),下面的建议要给代码爱好的 ...

  8. TSql CTE 递归原理探究

    CTE是如何进行递归的?产生递归的条件有三个,分别是 初始值 自身调用自身 结束递归的条件 1,示例代码 ;with cte as ( as jd union all as jd from cte ) ...

  9. 找到SQL Server的序列号

          有时候希望获取当前机器上安装的SQL Server序列号,但注册表中序列号是经过加密的,因此我写了一个小工具获取当前SQL Server的序列号.程序比较粗糙,没有做错误验证.       ...

  10. 引入CSS文件的@import与link的权重分析

    我很少在CSS用到@import这个标签,最近看到一句话“link方式的样式的权重 高于@import的权重”,感觉不太对,@import只是一个引入外部文件而已,怎么会有高于link的权重呢?于是我 ...