对于IoC容器来说,性能最好的莫过于Autofac了,而对于灵活度来说,它也是值得称赞的,为了考虑系统的性能,我们经常是在系统初始化于将所有依赖注册到容器里,当需要于根据别名把实现拿出来,然后再使用即可;而如果每次使用都是注册-反射,我相信那是很耗性能的,所以我们决定先依赖一次注册,按需反射对象的实例!
通过Named全局注册接口的所有实现
var builder = new ContainerBuilder(); builder.RegisterType<Mul1>()
.Named<IMul>("Mul1")
.InstancePerDependency(); builder.RegisterType<Mul2>()
.Named<IMul>("Mul2")
.InstancePerDependency();
通过ResolveNamed反射指定名称的实现
IContainer container = builder.Build();
IMul mul = container.ResolveNamed<IMul>("Mul2");
一般地,我们可以通过数据库或者XML文件来存储实现与接口的对应关系,应用程序在启动时读取这种关系,统一完成注册的过程
注册的方法
var type = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(i => i.Name == "XXX_TaskInfoProvider").FirstOrDefault();
builder.RegisterType(type).Named<ITaskInfoProvider>("XXX_TaskInfoProvider").InstancePerDependency();
可插拔模块-数据实体的设计
/// <summary>
/// 可插拔模块
/// </summary>
class Module
{
/// <summary>
/// 主键
/// </summary>
public int ID { get; set; }
/// <summary>
/// 目前类型,完整路径
/// </summary>
public string ToTypeName { get; set; }
/// <summary>
/// 接口名称,完整路径
/// </summary>
public string FromTypeName { get; set; }
/// <summary>
/// 描述
/// </summary>
public string About { get; set; }
}
这样我们在程序的初口就可以统一注入动态的模块了!
一般全局入口可以这样设计
//模块获取
ModuleList = new List<Modules>();
ModuleList.Add(new Modules { ID = , FromTypeName = "Progame.IMul", ToTypeName = "Progame.Mul1" });
ModuleList.Add(new Modules { ID = , FromTypeName = "Progame.IMul", ToTypeName = "Program.Mul2" }); //统一注册
var builder = new ContainerBuilder();
foreach (var item in ModuleList)
{
var fromType = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(i => i.FullName == item.FromTypeName).FirstOrDefault(); var toType = AppDomain.CurrentDomain.GetAssemblies()
.SelectMany(a => a.GetTypes())
.Where(i => i.FullName == item.ToTypeName).FirstOrDefault(); builder.RegisterType(toType).Named(toType.FullName, fromType).InstancePerDependency();
}
container = builder.Build();
这样就通用了...
IoC组件~Autofac将多实现一次注入,根据别名Resove实例的更多相关文章
-
我心中的核心组件(可插拔的AOP)~第十二回 IoC组件Unity
回到目录 说在前 Ioc组件有很多,之前也介绍过autofac,castle等,今天再来说一下在微软Nlayer DDD架构里使用的unity组件,今天主要说一下依靠注入,如果希望看拦截的用法,可以阅 ...
-
IoC组件Unity再续~根据类型字符串动态生产对象
回到目录 这个根据类型字符串动态去生产一个接口的对象,在实现项目中用途很广,这即省去了配置config文件的麻烦,又使用生产对象变更可配置,你完全可以把这种多态持久化到数据库里或者XML文件里,在使用 ...
-
Ioc容器Autofac系列(1)-- 初窥
一.前言 第一次接触Autofac是因为CMS系统--Orchard,后来在一个开源爬虫系统--NCrawler中也碰到过,随着深入了解,我越发觉得Ioc容器是Web开发中必不可少的利器.那么,Io ...
-
[转]ASP.NET MVC IOC 之AutoFac攻略
本文转自:http://www.cnblogs.com/WeiGe/p/3871451.html 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用A ...
-
ASP.NET MVC IOC 之AutoFac攻略
一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天,发现这个东东确实是个高大上的IOC容器~ Autofa ...
-
IOC容器 - Autofac概述
Autofac是比较出名的Ioc容器之一,熟悉Orchard的应该熟知.本文直接介绍autofac用法 一.开始 1.NuGet添加或者直接http://code.google.com/p/autof ...
-
ASP.NET MVC IOC 之AutoFac
ASP.NET MVC IOC 之AutoFac攻略 一.为什么使用AutoFac? 之前介绍了Unity和Ninject两个IOC容器,但是发现园子里用AutoFac的貌似更为普遍,于是捯饬了两天, ...
-
[转]Ioc容器Autofac
本文转自:http://www.cnblogs.com/hkncd/archive/2012/11/21/2780041.html Ioc容器Autofac系列(1)-- 初窥 前言 第一次接触A ...
-
ASP.NET MVC IOC 之 Autofac 系列开篇
本系列主要讲述Autofac在.NET MVC项目以及webform中的使用. autofac为IOC组件,实现控制反转,主要结合面向接口编程,完成较大程度的解耦工作. 作为初学者,将学习到的每一步, ...
随机推荐
-
Js删除数组重复元素的多种方法
js对数组元素去重有很多种处理的方法,本篇文章中为网络资源整理,当然每个方法我都去实现了:写下来的目的是希望自己活学活用,下次遇到问题后方便解决. 第一种 function oSort(arr){ v ...
-
KMP学习之旅
说起kmp就要从字符串的匹配说起,下面我们谈谈字符串的匹配 给定一个原字符串:bababababababababb,再给定一个模式串:bababb,求模式串是否在源字符串中出现 最简单的方法就是遍历源 ...
-
Bug:播放页面自动跳到首页
一,经历: 1.第一感觉就是从直播间中收到了通知,然后通知得知了用户未登录,直播间便 pop 退出了. 2.由于这个问题是很难复现的,研究了快一个星期后,才发现是直播间底部的我的历史页面中接收到了直播 ...
-
HTTP gzip和deflate的几点区别
gzip是一种数据格式,默认且目前仅使用deflate算法压缩data部分:deflate是一种压缩算法,是huffman编码的一种加强. deflate与gzip解压的代码几乎相同,可以合成一块代码 ...
-
MyBatis(3.2.3) - Configuring MyBatis using XML, Environment
The key component of MyBatis is SqlSessionFactory from which we get SqlSession and execute the mappe ...
-
数据库导出到excel
项目结构同上一篇 泛型通用的写法 ExportExcel.java package excel; import java.io.OutputStream; import java.lang.refle ...
-
[Q]手动加载菜单方法
一般情况下,安装程序会自动安装依云软件菜单,但可能由于某些原因未能自动安装的话,您可以手动加载菜单,步骤如下: 在AoutCAD命令行输入"CUILOAD",会弹出"加载 ...
-
JS中substr和substring的用法和区别
substr 和 substring都是JS 截取字符串函数,两者用法很相近,下面是两者的语法很示例: substr 方法 返回一个从指定位置开始的指定长度的子字符串.stringvar.substr ...
-
从零开始学安全(十一)●IP地址
127 都是本机地址 ip DE 类网段 都是广播网段 它并不指向特定的网络 用不上
-
剑指offer(52)正则表达式的匹配
题目描述 请实现一个函数用来匹配包括'.'和'*'的正则表达式.模式中的字符'.'表示任意一个字符,而'*'表示它前面的字符可以出现任意次(包含0次). 在本题中,匹配是指字符串的所有字符匹配整个模式 ...