zoukankan      html  css  js  c++  java
  • 使用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分解项目组件间的复杂关系。

    欢迎大家扫描下面二维码成为我的客户,为你服务和上云

  • 相关阅读:
    XAF 有条件的对象访问权限
    XAF 顯示 UnInplace Report(設置自定義條件顯示報表,不是根據選擇ListView記錄條件顯示報表)
    XAF 如何自定义PivotGrid单元格显示文本?
    XAF 如何布局详细视图上的按钮
    XAF How to set size of a popup detail view
    XAF Delta Replication Module for Devexpress eXpressApp Framework
    XAF 帮助文档翻译 EasyTest Basics(基础)
    XAF 用户双击ListView记录时禁止显示DetailView
    XAF How to enable LayoutView mode in the GridControl in List Views
    XAF 如何实现ListView单元格批量更改?
  • 原文地址:https://www.cnblogs.com/shanyou/p/1746711.html
Copyright © 2011-2022 走看看