较复杂的应用程序都以由五个门类协会成的,项目能够划分成程序集(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 伊芙ntLogName = “网站通行证”;
       public static string 伊夫ntLogSource = “应用程序”;

       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分解项目组件间的扑朔迷离关系。

相关文章

网站地图xml地图