我的开发框架(WinForm)3

今天继续给大家介绍核心库的IOC的使用,在我的框架里,IOC使用的比较简单,主要是用于解除模块间的耦合和实例化接口。

1、接口说明,IocContainer接口比较简单只有3个方法,但是是系统中用的最多的。

  1. IocContainer
  1. public interface IocContainer:IDisposable
  2. {
  3. /// <summary>
  4. /// 获得某个接口的一组实例
  5. /// </summary>
  6. /// <typeparam name="T"></typeparam>
  7. /// <returns>IEnumerable{``0}.</returns>
  8. IEnumerable<T> GetInstances<T>();
  9. /// <summary>
  10. /// 获取接口的一个实例
  11. /// </summary>
  12. /// <typeparam name="T">接口的类型</typeparam>
  13. /// <returns>,如果没有注册该接口,则返回null</returns>
  14. T GetInstance<T>();
  15.  
  16. /// <summary>
  17. /// 根据关键字获取对象
  18. /// </summary>
  19. /// <param name="key">The key.</param>
  20. /// <returns>System.Object.</returns>
  21. object GetInstance(string key);
  22. }

2、接口的实现。我用的是AutoFac,选用他基于2个方面的考虑,第一是对MEf和泛型的支持,第二是效率

园子里的Leepy 已经对比过主流的IOC框架,http://www.cnblogs.com/liping13599168/archive/2011/07/17/2108734.html

时间比较早了,有兴趣的可以用最新的类库测试一下。

AutoFac有对MEF的扩展插件,很方便。这样做的好处是,我可以只在核心模块中引用AutoFac ,业务模块中无需引用,用Mef标示即可,对于团队开发来说,他无需再了解AutoFac如何使用。

不多说了,上代码

  1. ContainerBuilder builder;
  2. IContainer _container = null;
  3. public AutofacContainer(params ComposablePartCatalog[] catalogs)
  4. {
  5. builder = new ContainerBuilder();
  6.  
  7. bool isRegisterOrm = false;
  8. foreach (var item in catalogs)
  9. {
  10. builder.RegisterComposablePartCatalog(item);
  11.  
  12. if (item is DirectoryCatalog && !isRegisterOrm)
  13. {
  14. DirectoryCatalog dir=item as DirectoryCatalog;
  15. }
  16. }
  17.  
  18. }
  19.  
  20. 其中ComposablePartCatalog MEF的东东,ContainerBuilder AutoFac的东西, 这一步主要是讲Mef的组件注册到AutoFac里。然后通过 IContainer Container=builder.Build(Autofac.Builder.ContainerBuildOptions.IgnoreStartableComponents); 这个方法初始化完成,我测试的时候发现这个方法,只能执行一次,第二次就报错。
  1. 对应IocContainer.GetInstance 这个方法的实现就简单了,调用Autofac的对应的方法就行了
  1. bool bl = Container.TryResolve<T>(out t);
  1. 返回t OK了,
  1.  
  1.  

需要注意的是,Mef对泛型支持的不太好,所以需要单独处理。

对于IRepository<T>和IRepository<T,Tid>接口来说,最理想的的情况是,我需要处理哪个实体类,就直接用var rep=  IocContainer.GetInstance<IRepository<T>>() 这种方式,就能到IRepository<T>的实例,然后进行后面的操作了。

首先获得加载文件的所有 Assembly,然后判断他的名字是否以"Repository`1"结尾,然后调用AutoFac的泛型注册方法,注册,

  1. 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 也是一知半解,只能用笨办法,肯定有好的办法,只是我还不知道.望园子里的高手指点一下。

通过IocContainer接口,我们就可以创建并使用所有的接口了。
3、使用
   在Core中我设计了一个全局静态类ApplicationEx,把IocContainer接口作为一个只读属性暴露出来,接口的实例化操作都在ApplicationEx的初始化中完成,在其他启动的时候,初始化ApplicationEx一次,保证IOC被初始化一次,后面所有模块的直接使用ApplicationEx的Container属性。这就达到了我们想要的目的。
4、扩展
我是一个比较懒的人,不想每次都写var rep=  IocContainer.GetInstance<IRepository<T>>() ,觉得写得有点多
然后在Core里给IocContainer 增加了个扩展方法,
  1. /// <summary>
  2. /// 获得数据操作仓库接口
  3. /// </summary>
  4. /// <typeparam name="T">操作的实体类</typeparam>
  5. /// <returns>IRepository{``0}.</returns>
  6. public static IRepository<T> GetRepository<T>(this IocContainer ioc) where T : EntityBase, new()
  7. {
  8. return ioc.GetInstance<IRepository<T>>();
  9. }

以后所有的模块调用就直接写var rep=  IocContainer.GetRepository<T>(),又少写了10几个字符,呵呵呵。

今天就到这里吧,后面接着给大家介绍。

 
 
分类: .Net

开发框架(WinForm)3的更多相关文章

  1. RDIFramework.NET敏捷开发框架WinForm新增文件中心-实现附件集中管理

    1.引言 文件中心类似附件管理是一个非常实用功能,可以归档自己平时所需要的文件,也可以把文件分享给别人,更像一个知识中心.文件中心主界面如下图所示,左侧"附件分类"展示了用户对文件 ...

  2. 我的开发框架(WinForm)2

    上篇文章简单的介绍了一下,我的一个开发框架.看的人还不少,多谢大家的关注,我继续介绍一下,模块和模块之间是怎么组织起来的. Data模块: 该模块主要完成对数据的操作,采用仓储模式实现,在核心模块(C ...

  3. 我的开发框架(WinForm)

    近来,看园子里,好多同学,展示自己工作中的开发框架,有的功能强大,有的短小精悍,我也来凑个热闹,望各位大侠指点一二. 一.指导思想 1.尽量减少程序员对数据库的依赖,或者说尽力少的写sql 语句.根据 ...

  4. 我的开发框架(WinForm)4

    日志模块 对于一个系统来说,日志模块是必不可少的,它能给后面系统的维护和bug的修复,带来极大的方便..net的日志模块有很多,比较流行的有Log4Net,NLog,还有微软企业库的日志模块,我采用的 ...

  5. 我的开发框架(WinForm)3

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

  6. WinForm开发中通用附件管理控件设计开发参考

    1.引言 在WinForm开发中,文件附件的管理几乎在任何一个应用上都会存在,是一个非常通用集中的公共模块.我们日常记录会伴随着有图片.文档等附件形式来展现,如果为每个业务对象都做一个附件管理,或者每 ...

  7. RDIFramework.NET ━ .NET敏捷开发框架全新发布-最好用的.NET开发框架 100%源码授权

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发框架.10年沉淀.历经上千项目检验,致力于企业智能化开发,帮助提升软件开发效率.最好用的.NET开发框架,100%源码授权. 1. ...

  8. RDIFramework.NET敏捷开发框架 ━ 工作流程组件介绍

    RDIFramework.NET,基于.NET的快速信息化系统敏捷开发.整合框架,给用户和开发者最佳的.Net框架部署方案. 1.RDIFramework.NET敏捷开发框架介绍 RDIFramewo ...

  9. RDIFramework.NET敏捷开发框架Web新增邮件中心实现便捷式的邮件收发

    1.引言 邮件收发在很多业务系统中都有这样的需求,是比较正式和常用的功能.在我们的框架中提供了邮件中心功能模块,集内部邮件的收发.邮件归类.邮件星标的标记.邮件的删除与彻底删除等,邮件中心功能模块界面 ...

随机推荐

  1. 几款web版整合(QQ、msn、icq、yahoo通、Gtalk等)即时聊天http://hi.baidu.com/ejie/blog/item/e89794ef9a9431efce1b3ebd.html

        直到近期为止,我们经常使用的即时聊天工具(QQ.msn等)了Web版,大家不用下载庞大软件,直接打开网页就能够与自己的好友聊天,很方便.在此将时汇总,便于大家查找,节约大家一点时间. 此都是官 ...

  2. 在Windows系统中安装集成的PHP开发环境

    原文:在Windows系统中安装集成的PHP开发环境 刚想学php的,又不会配置复杂php的环境,可以使用集成的,目前网上提供常用的PHP集成环境主要有AppServ.phpStudy.WAMP和XA ...

  3. jquery自己主动旋转的登录界面的背景代码登录页背景图

    在其他网站上看到比较爽Web登录界面.背景图片可以自己主动旋转. 介绍给大家.有兴趣的可以改改下来作为自己的系统登录界面. 如图: watermark/2/text/aHR0cDovL2Jsb2cuY ...

  4. javascript2

    代码变化一:<script> function abs(){ var x; if(x>0){ return x; } else{ return -x; } } console.log ...

  5. Backbone入门

    Backbone入门讲解 Backbone是一个实现了web前端mvc模式的js框架. 一种解决问题的通用方法,我们叫做模式. 设计模式:工厂模式,适配器模式,观察者模式等,推荐js设计模式这本书.设 ...

  6. .Net Framework基础知识

    .net常识 .net framework是微软为开发应用程序而创建的一个富有革命性的新平台:   .net可以用来开发windows应用程序,web应用程序,web服务和其它各种类型的程序.   . ...

  7. [WebGL入门]十六,绘制多个模型

    注意:文章翻译http://wgld.org/.原作者杉本雅広(doxas),文章中假设有我的额外说明,我会加上[lufy:],另外.鄙人webgl研究还不够深入.一些专业词语.假设翻译有误.欢迎大家 ...

  8. WebService它CXF这三个音符(Service接口实现类)

    ITeacherServiceImpl.java: /** * @Title:ITeacherServiceImpl.java * @Package:com.you.service.impl * @D ...

  9. AJAX跨域调用ASP.NET MVC或者WebAPI服务

    关于AJAX跨域调用ASP.NET MVC或者WebAPI服务的问题及解决方案 作者:陈希章 时间:2014-7-3 问题描述 当跨域(cross domain)调用ASP.NET MVC或者ASP. ...

  10. DataInputStream(二进制输入流)和DataOutputStream二进制输出流(注意:in是从本地文件输入到程序中,out是从程序输出到本地种)

    //切记以数据类型输出就以什么数据类型读入, //例如: dos.writeInt(100);写入,读取:dis.readUTF()有时会出现意想不到的错误,所以要时刻记得以数据类型输出就以什么数据类 ...