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の疑似コードは
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プロファイルの構成が簡単になります.
モジュールを使用して異なるプログラムセットのコンポーネントをコンテナに登録します.モジュールは一般的に以下の内容を構成する必要があります.ログ記録を構成するILogコンポーネント(コンソール、テキストファイル、Windowsログファイルなど) を登録する.異常処理ポリシー の構成登録データアクセスクラス 登録クロスフォーカス 構成検証規則 AutofacのModuleでプロジェクトコンポーネント間の複雑な関係を分解します.
Assembliesは通常、再利用可能な機能とテストの容易さを含む一般的なクラスライブラリプロジェクトです.通常、次のコンポーネントが含まれます.
これらのロジックを分離するために、いくつかのインタフェースを定義し、構成コードを通じて具体的な実装を関連付けることができます.例えば、ログ記録はインタフェースILogを定義することができます.本番環境では、Apache log4netまたはエンタープライズクラスライブラリのログ記録モジュールに変更することができます.これはインタフェースの定義と実装が分離されているため、異なる環境で異なる実装を使用することができ、構成の変更だけでコードを再コンパイルしないでください.
Hostsはアプリケーションのエントリを表し、次の形式があります.
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
上記は、ログモジュールの構成をコードで構成することで、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>
モジュールを使用して異なるプログラムセットのコンポーネントをコンテナに登録します.モジュールは一般的に以下の内容を構成する必要があります.