Autofac IOCを使用したマルチプロジェクトアプリケーションの組織

4874 ワード

複雑なアプリケーションは複数のプロジェクトで構成されており、プロジェクトはプログラムセット(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プロジェクトは小さく、コンテナの構成とシェルの呼び出しの2つの側面を主に完了します.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 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でプロジェクトコンポーネント間の複雑な関係を分解します.