使用Autofac IOC组织多项目应用程序

较复杂的应用程序都是由多个项目组织成的,项目可以划分成程序集(Assemblies)和宿主(Hosts),也就是应用程序的入口。

Assemblies 通常是常见的类库项目,包括可以重用的功能和方便测试,通常包括下面的组件:

  • Views, Controllers 和 Models
  • 服务
  • 持久类 和 repositories
  • Decorators
  • Reusable user controls
  • 规则库
  • 业务逻辑
    这些项目通常不应该直接依赖于下面的组件:
  • IoC 容器程序集;
  • 日志记录框架 ;
  • 数据访问框架;
  • 其他第三方类库.

为了分离这些逻辑,我们可以定义一些接口,然后通过配置代码将具体实现关联起来,例如日志记录我们可以定义一个接口ILog,生产环境下我们可以把它改成用Apache log4net或者企业类库的日志记录模块都可以。由于这是接口定义和实现分离的,我们可以在不同环境下使用不同的实现,只需要通过配置修改就可以而不要重新编译代码。

Hosts代表应用程的入口,有下面这些形式:

  • 桌面应用程序:
  • Windows.Forms;
  • WPF;
  • 控制台应用程序;
  • windows 服务;
  • Web应用程序
  • Microsoft Office Add-Ins;
  • Microsoft Azure Roles.

Host负责构建应用程环境(上下文),并把它传递给应用程序的入口,在IOC容器方面来说,通过配置容器中的应用程序组件,获取Shell类并运行。通常Host项目都很小,主要完成两个方面的工作:配置容器和调用Shell.Run()。

用Autofac的Host的伪代码类似于

var builder = new ContainerBuilder();
builder.Register(new ConfigurationSettingsReader());
using (var container = builder.Build())
{
   var shell = container.Resolve<Shell>();
   shell.Execute();
}

上述代码中new ConfigurationSettingsReader()就是autofac从配置文件中读取相关的组件配置,一般使用XML文件进行配置,autofac的xml配置文档可以看XmlConfiguration,使用配置文件也有缺点:

不是强类型的,编译器无法发现错误,没有智能提示
配置文件会变得越来越大
维护多个配置文件比较困难
文件文件不适合用于复杂的环境
上述缺点我们可以通过.NET代码块封装相关的配置细节,在XML文件中只保留粗粒度的配置,Autofac可以通过Module进行配置块的封装,具体可以参考文档StructuringWithModules。

我这里取个例子:

public  class LoggingModule : Module
   {
       public Mode Mode { get; set; }
       public static string EventLogName = "网站通行证";
       public static string EventLogSource = "应用程序";

       public LoggingModule()
       {
           Mode = NCASService.Mode.Diagnostics;
       }

       protected override void Load(ContainerBuilder builder)
       {
           // configure logging
           var logger = GetLoggerForWindows(Mode);
           builder.RegisterInstance(logger);
           builder.RegisterInstance(logger.Get("DefaultLog"));
           base.Load(builder);
       }

       static INamedProvider<ILog> GetLoggerForWindows(Mode mode)
       {  // configuring different logging based on our mode
           switch (mode)
           {
               case Mode.Release:
                   // write all informational and higher events to indows event log
                   LoggingStack.UseEventLog(EventLogName, EventLogSource)
                       .Filter(LogLevel.Info, LogLevel.Max);
                   // dump all warning and higher messages to rolling text log
                   LoggingStack.UseRollingLog(@"logs\errorlog.txt", 100.Kb(), 10)
                       .Filter(LogLevel.Warn, LogLevel.Fatal);
                   break;
               case Mode.Diagnostics:
                   // dump all messages to daily log
                   LoggingStack.UseDailyLog(@"log.txt");
                   break;
               case Mode.Debug:
                   // Visual studio would get these messages
                   return TraceLog.Provider;
               default:
                   throw new ArgumentOutOfRangeException("mode");
           }
           return LoggingStack.GetLogProvider();
       }

上述是把我们的日志模块的配置用代码进行配置,我们的XML配置文件中的配置就会变得很简单:

<!-- Production configuration -->
<module type="NdonFramework.NCASService.LoggingModule, NCASService">
</module>

<!-- Development configuration -->
<module type="NdonFramework.NCASService.LoggingModule, NCASService">
  <properties>
    <property name="Mode" value="Debug" />

  </properties>
</module>  

<!-- Sandbox configuration -->
<module type="NdonFramework.NCASService.LoggingModule, NCASService">
  <properties>
    <property name="Mode" value="Diagnostics" />
  </properties>
</module>

使用模块组织不同程序集中的组件注册到容器里,模块我一般需要配置以下内容:

配置日志记录并注册ILog组件(例如记录到控制台,文本文件、Windows日志文件)

  • 配置异常处理策略
  • 注册数据访问类
  • 注册交叉关注点
  • 配置验证规则
  • 通过Autofac的Module分解项目组件间的复杂关系。

本文来自合作伙伴“doNET跨平台”,了解相关信息可以关注“opendotnet”微信公众号

时间: 2024-12-03 17:57:07

使用Autofac IOC组织多项目应用程序的相关文章

【PMP认证考试之个人总结】第 2 章 组织和项目生命周期及管理过程

第 2章 组织和项目生命周期及管理过程 <PMP个人备考笔记(全篇)>下载 2.1 组织结构   常见考点: 1.PM的权利从左到右,越来越大. 权利大小:职能型 < 弱矩阵 < 平衡矩阵(默认类型) <强矩阵(最佳) < 项目型矩阵 : 2.PM全职 ==>平衡矩阵之后: 员工全职 ==>强矩阵之后. 3.各部门工作项目独立的组织结构,就是职能型组织. 4.PM在矩阵型最重要的作用是整合:在职能型是沟通:在项目型是领导. 2.2 组织过程资产和事业环境因素

《Android App开发入门:使用Android Studio 2.X开发环境》——2-8 修改项目的程序包名称和应用程序 ID

2-8 修改项目的程序包名称和应用程序 ID 如果用户将第 2-5 节的 Ch02_Button 范例部署到手机上执行,然后又把第 2-6 节的范例 Ch02_EditText 部署到手机上执行,会发现手机的应用程序列表中只有 Ch02_ExitText,却没有 Ch02_Button. 在第1章曾经提过,程序包名称是 Android App 在手机上的身份证 ID,而 Ch02_ExitText 项目是从 Ch02_Button 复制而来的,它们的程序包名称相同(?ag.com.ch02_bu

VC++的项目,如何分层管理项目的程序文件啊?

问题描述 以前都是用java和C#开发项目的,按照MVC架构或者模块划分.都可以把程序按照文件夹分层管理..但最近刚接触VC++,发现VC只能建立filter,并没实现物理划分存储啊...请问在VS2008环境里,建立一个VC++的项目,如何分层管理项目的程序文件啊.java中可以分层管理程序文件,如下图C++中,只能建立filter逻辑划分,但无法物理划分..请问还有别的好方法吗?   问题补充:<div class="quote_title">lemonlinger 写

讨论:有多少项目是因为程序的原因而失败的

导读:外刊IT评论翻译了一篇<关于程序成本的讨论>以下是文章全部内容: 昨天在#SCNA(北美2010软件技术大会)的一个专题小组讨论会上,@chadfowler 提出了这个问题:"有多少项目是因为程序的原因而失败的?"我想,他是想说造成项目失败的主要原因是业务问题,而非技术问题. 今天早上我把这个问题发布在了微博上.很快就有了回复,几乎所有人都认为导致项目失败的原因中业务问题是罪魁祸首. 完全没错,项目会因为成本,需求,进度计划,管理等问题而失败.可同样没错的是,从来没有

Java项目经验——程序员成长的钥匙

Java就是用来做项目的!Java的主要应用领域就是企业级的项目开发!要想从事企业级的项目开发,你必须掌握如下要点: 1.掌握项目开发的基本步骤 2.具备极强的面向对象的分析与设计技巧 3.掌握用例驱动.以架构为核心的主流开发方法 没有人愿意自己一辈子就满足于掌握了一些代码实现的技巧,别人告诉你要实现什么,你就用代码堆砌来实现别人的要求!你必须学会从整个项目的角度去思考!你必须学会假如你是项目经理,你该如何思考!你必须学会假如你是架构师,你该如何思考!你必须掌握针对某个特定问题领域的分析方法!

开源项目PEAR程序包下载,附手册(phplib,db,phpunit...)

程序|下载|项目 解开放开php需要include的地方就可以了.引文件说明:DB.php 用于连接数据库,针对数据库比较多,减少开发量,还文便移植数据库. phplib 模板,页面与代码分离. phpunit PHP调试程序,不用费尽心机地去模拟调试了. ......其它的自已慢慢看吧.

2014秋C++ 第15周项目2程序阅读(加注释)

课程主页在http://blog.csdn.net/sxhelijian/article/details/39152703,课程资源在云学堂"贺老师课堂"同步展示,使用的帐号请到课程主页中查看.  [项目2-阅读程序] 阅读下面的程序,先写出其运行结果,再运行对比. 支招1:按课堂上老师讲课的方式,将变量对应内存的"框子"画出来,用大脑当CPU,写出变量的变化过程: 支招2:单步执行程序,在监视(watch)窗口中观察变量的动态变化,从而掌握程序的运行机理. (1)

C++第6周项目2 - 程序填空

课程首页地址:http://blog.csdn.net/sxhelijian/article/details/7910565,本周题目链接:http://blog.csdn.net/sxhelijian/article/details/8748730 [题目]程序填空:按要求将缺少的代码填进去,经调试确认符合要求 a. 用指针访问对象 class A { private: int a; public: A() {a=0;} ___(1)___{} //定义构造函数,用参数aa初始化数据成员a }

C++第4周(春)项目3 程序的多文件组织

课程首页在:http://blog.csdn.net/sxhelijian/article/details/11890759,内有完整教学方案及资源链接 利用多文件组织,重新实现项目2.其中,整个项目包括3个文件: 主文件: main.cpp,用于定义main()函数 头文件: triangle.h,头文件,声明类,定义内置成员函数 类定义文件: triangle.cpp,用于定义类Triangle中其他成员函数 注意,将3个set函数和3个get函数设计成内置成员函数,其他函数不作为内置函数.