开发框架(WinForm)3
我的开发框架(WinForm)3
今天继续给大家介绍核心库的IOC的使用,在我的框架里,IOC使用的比较简单,主要是用于解除模块间的耦合和实例化接口。
1、接口说明,IocContainer接口比较简单只有3个方法,但是是系统中用的最多的。

IocContainer
public interface IocContainer:IDisposable
{
/// <summary>
/// 获得某个接口的一组实例
/// </summary>
/// <typeparam name="T"></typeparam>
/// <returns>IEnumerable{``0}.</returns>
IEnumerable<T> GetInstances<T>();
/// <summary>
/// 获取接口的一个实例
/// </summary>
/// <typeparam name="T">接口的类型</typeparam>
/// <returns>,如果没有注册该接口,则返回null</returns>
T GetInstance<T>(); /// <summary>
/// 根据关键字获取对象
/// </summary>
/// <param name="key">The key.</param>
/// <returns>System.Object.</returns>
object GetInstance(string key);
}
2、接口的实现。我用的是AutoFac,选用他基于2个方面的考虑,第一是对MEf和泛型的支持,第二是效率
园子里的Leepy 已经对比过主流的IOC框架,http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html,
时间比较早了,有兴趣的可以用最新的类库测试一下。
AutoFac有对MEF的扩展插件,很方便。这样做的好处是,我可以只在核心模块中引用AutoFac ,业务模块中无需引用,用Mef标示即可,对于团队开发来说,他无需再了解AutoFac如何使用。
不多说了,上代码
ContainerBuilder builder;
IContainer _container = null;
public AutofacContainer(params ComposablePartCatalog[] catalogs)
{
builder = new ContainerBuilder(); bool isRegisterOrm = false;
foreach (var item in catalogs)
{
builder.RegisterComposablePartCatalog(item); if (item is DirectoryCatalog && !isRegisterOrm)
{
DirectoryCatalog dir=item as DirectoryCatalog;
}
} } 其中ComposablePartCatalog 是MEF的东东,ContainerBuilder 是AutoFac的东西, 这一步主要是讲Mef的组件注册到AutoFac里。然后通过 IContainer Container=builder.Build(Autofac.Builder.ContainerBuildOptions.IgnoreStartableComponents); 这个方法初始化完成,我测试的时候发现这个方法,只能执行一次,第二次就报错。
对应IocContainer.GetInstance 这个方法的实现就简单了,调用Autofac的对应的方法就行了
bool bl = Container.TryResolve<T>(out t);
返回t 就OK了,
需要注意的是,Mef对泛型支持的不太好,所以需要单独处理。
对于IRepository<T>和IRepository<T,Tid>接口来说,最理想的的情况是,我需要处理哪个实体类,就直接用var rep= IocContainer.GetInstance<IRepository<T>>() 这种方式,就能到IRepository<T>的实例,然后进行后面的操作了。
首先获得加载文件的所有 Assembly,然后判断他的名字是否以"Repository`1"结尾,然后调用AutoFac的泛型注册方法,注册,
Assembly ass = Assembly.LoadFile(filepath);
Type[] types = ass.GetTypes().Where(t => t.Name.EndsWith("Repository`1")).ToArray();
if (types.Length > 0 && types[0].Name != "IRepository`1")
{
builder.RegisterGeneric(types[0]).As(typeof(IRepository<>));
isload = true;
}
由于本人对Autofac 也是一知半解,只能用笨办法,肯定有好的办法,只是我还不知道.望园子里的高手指点一下。
/// <summary>
/// 获得数据操作仓库接口
/// </summary>
/// <typeparam name="T">操作的实体类</typeparam>
/// <returns>IRepository{``0}.</returns>
public static IRepository<T> GetRepository<T>(this IocContainer ioc) where T : EntityBase, new()
{
return ioc.GetInstance<IRepository<T>>();
}
以后所有的模块调用就直接写var rep= IocContainer.GetRepository<T>(),又少写了10几个字符,呵呵呵。
今天就到这里吧,后面接着给大家介绍。
开发框架(WinForm)3的更多相关文章
- RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理
1.引言 文件中心类似附件管理是一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧"附件分类"展示了用户对文件 ...
- 我的开发框架(WinForm)2
上篇文章简单的介绍了一下,我的一个开发框架.看的人还不少,多谢大家的关注,我继续介绍一下,模块和模块之间是怎么组织起来的. Data模块: 该模块主要完成对数据的操作,采用仓储模式实现,在核心模块(C ...
- 我的开发框架(WinForm)
近来,看园子里,好多同学,展示自己工作中的开发框架,有的功能强大,有的短小精悍,我也来凑个热闹,望各位大侠指点一二. 一.指导思想 1.尽量减少程序员对数据库的依赖,或者说尽力少的写sql 语句.根据 ...
- 我的开发框架(WinForm)4
日志模块 对于一个系统来说,日志模块是必不可少的,它能给后面系统的维护和bug的修复,带来极大的方便..net的日志模块有很多,比较流行的有Log4Net,NLog,还有微软企业库的日志模块,我采用的 ...
- 我的开发框架(WinForm)3
今天继续给大家介绍核心库的IOC的使用,在我的框架里,IOC使用的比较简单,主要是用于解除模块间的耦合和实例化接口. 1.接口说明,IocContainer接口比较简单只有3个方法,但是是系统中用的最 ...
- WinForm开发中通用附件管理控件设计开发参考
1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ...
- RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...
- RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍
RDIFramework.NET,基于.NET的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET敏捷开发框架介绍 RDIFramewo ...
- RDIFramework.NET敏捷开发框架Web新增邮件中心实现便捷式的邮件收发
1.引言 邮件收发在很多业务系统中都有这样的需求,是比较正式和常用的功能.在我们的框架中提供了邮件中心功能模块,集内部邮件的收发.邮件归类.邮件星标的标记.邮件的删除与彻底删除等,邮件中心功能模块界面 ...
随机推荐
- linux_Ubuntu 12.04 安装jdk
1.下载jdk6jdk6下载地址为:http://download.java.net/jdk6/,根据操作系统的选择对应的安装包,我的是ubuntu 12.04 32bit的,所以下载的文件是jdk- ...
- hdu2191 悼念512汶川大地震遇难同胞——珍惜如今,感恩生活
转载请注明出处:http://blog.csdn.net/u012860063 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2191 Problem ...
- 解决Uploadify上传控件加载导致的GET 404 Not Found问题
今天在项目发用到Uploadify上传, 发现在打开页面时会有一多余的请求,由于路由没有设置这个,导致404错误,能搜索查到以下解决的方法 <Uploadify v3 bug. Unecessa ...
- sql 给表结构增加说明
create proc proc_addReMark @TableName nvarchar(50), @RowName nvarchar(50), @RowReMark nv ...
- 利用docker搭建yii2 详细步骤
定位镜像 在hub.docker.com 搜索yii2,并且最后定位到 https://hub.docker.com/r/codemix/yii2-base/codemix/yii2-base 然后在 ...
- WEB安全实战(五)XSS 攻击的第二种解决方式(推荐)
序 说到 XSS 攻击,前边已经有两篇文章在讲这个事了,这次又拿出来说,主要是针对近期工作中的一些新的问题.那么之前是怎么解决问题的呢?为什么又要换解决方式?以下就具体的跟大家分享一下. 旧方案 公司 ...
- openwrt路由器更换了Flash之后需要修改的源码
假如我使用的是WR703N,改为8M内存: 1 修改openwrt/target/linux/ar71xx/image/Makefile文件 $(eval $(call SingleProfile,T ...
- Visual Studio 中的单元测试 UNIT TEST
原文:Visual Studio 中的单元测试 UNIT TEST 注:本文系作者原创,可随意转载,但请注明出处.如实在不愿注明可留空,强烈反对更改原创出处.TDD(Test-Driven Devel ...
- 使用Windows2003的IIS发布网站 - 进阶者系列 - 学习者系列文章
本系列文章目录:http://www.cnblogs.com/lzhdim/category/277150.html Windows 2003是一款不错的Windows服务器版本.在刚工作的前些年里, ...
- SQL Server 2005中设置Reporting Services发布web报表的匿名访问
原文:SQL Server 2005中设置Reporting Services发布web报表的匿名访问 一位朋友提出个问题:集成到SQL Server 2005中的Reporting Services ...