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. alwaysOn为什么不支持分布式事务

    Alwayson是微软从SQL2012开始引入的一种高可用和高性能架构,它既可以实现故障转移,同时又能实现查询分离,是当前SQL server的所有架构中最优秀的一种. 因此,一般我们都会推荐使用Al ...

  2. FB引擎系列-之CloudSand

    CloudSand,欲打破之前的集中版本制作的模式, http://code.taobao.org/p/cloudsand包含服务器端代码(php)和客户端代码(unity)   EasyDown的时 ...

  3. Andrew Ng机器学习公开课笔记 -- Regularization and Model Selection

    网易公开课,第10,11课 notes,http://cs229.stanford.edu/notes/cs229-notes5.pdf   Model Selection 首先需要解决的问题是,模型 ...

  4. Atitit 图像处理 公共模块 矩阵扫描器

    Atitit 图像处理 公共模块 矩阵扫描器 1.1. 调用说明对矩阵像素遍历处理调用1 2. 矩阵扫描器主题结构1 2.1. 主要说明 从像素点开始填充矩阵1 2.2. 得到模板中心点所对应的图像坐 ...

  5. js显示yyyy年mm日dd天 星期几 的格式日期

    js代码: <script type="text/javascript"> var today = new Date(); var week; //存储星期几 var ...

  6. 每天一个linux命令(9):touch 命令

    linux的touch命令不常用,一般在使用make的时候可能会用到,用来修改文件时间戳,或者新建一个不存在的文件. 1.命令格式: touch [选项]... 文件... 2.命令参数: -a    ...

  7. python2.7和python3共存

    python2.7和python3共存 原本装了python,玩nodejs的时候需要node-gyp来编译依赖,无赖这货需要python2.5<v<3.0,那就弄两个版本吧 转载自 ht ...

  8. KnockoutJS 3.X API 第三章 计算监控属性(5) 参考手册

    计算监控属性构造参考 计算监控属性可使用以下形式进行构造: ko.computed( evaluator [, targetObject, options] ) - 这种形式是创建一个计算监控属性最常 ...

  9. js高程读书笔记(1-3章)

    一.js简介 js是一种专为与网页交互而设计的脚本语言,由以下三个不同的部分组成: 1.ECMAScript,由ECMA-262(它规定了语言的这些组成部分:语法,类型,语句,关键字,保留字,操作符, ...

  10. WPF自定义控件与样式(12)-缩略图ThumbnailImage /gif动画图/图片列表

    一.前言 申明:WPF自定义控件与样式是一个系列文章,前后是有些关联的,但大多是按照由简到繁的顺序逐步发布的等,若有不明白的地方可以参考本系列前面的文章,文末附有部分文章链接. 本文主要针对WPF项目 ...