1

私はWPFアプリケーションを構築しています。Prism 4 と Unity を使用しています。ロギングと例外処理という 2 つの Enterprise Library 5 ブロックをアプリケーションに追加したいと考えています。ILoggerFacade をサポートするインフラストラクチャ クラスにシングルトンの LoggerFacadeCustom.cs があり、ブートストラップでそれを作成し、ログ ファイルを生成しています。コンストラクターでユニティコンテナーを「ニュース」します(2番目のコードブロック)

ExceptionManager の container.resolve はどこに追加すればよいですか? ブートストラップで例外処理ブロックを ILoggerFacade に接続するにはどうすればよいですか? すべての例外を同じログに出力するにはどうすればよいですか? これが私の既存のbootstrapper.csです

  public class Bootstrapper : UnityBootstrapper {

     protected override ILoggerFacade CreateLogger() {
        return LoggerFacadeCustom.Instance;
     }

     protected override DependencyObject CreateShell() {
        return Container.Resolve<Shell>();
     }

     protected override void InitializeShell() {
        base.InitializeShell();

        App.Current.MainWindow = (Window)Shell;
        App.Current.MainWindow.Show();

     //Other shell stuff...

     }

     protected override IModuleCatalog CreateModuleCatalog() {

        var catalog = new ModuleCatalog();

        //These primary modules must register their own services as if they were acting independantly
        catalog.AddModule(typeof(XmlCommentMergeModule));

        //These support modules require at least one primary module above to be added first
        catalog.AddModule(typeof(ToolboxHeaderModule));
        catalog.AddModule(typeof(ToolboxFooterModule));
        catalog.AddModule(typeof(ToolboxStartModule));
        return catalog;
     }
  }

LoggerFacadeCustom:

  public class LoggerFacadeCustom : ILoggerFacade {

     private static readonly LoggerFacadeCustom _instance = new LoggerFacadeCustom();
     public static LoggerFacadeCustom Instance { get { return _instance; } }

     private LoggerFacadeCustom() {
        var container = new UnityContainer();
        container.AddNewExtension<EnterpriseLibraryCoreExtension>();

        _logWriter = container.Resolve<LogWriter>();
     }

     private readonly LogWriter _logWriter;


     public void Write(string message) { Write(message, null); }

           public void Write(string message, string category, int priority) {
     _logWriter.Write(message, category, priority);
  }

           public void Write(string message, Dictionary<string, object> properties) {
     _logWriter.Write(message, LiteralString.LogCategoryProcess, properties);
  }


     #region ILoggerFacade Members

     public void Log(string message, Category category, Priority priority) {
        throw new NotImplementedException();
     }

     #endregion
  }
4

1 に答える 1

0

ブートストラッパーは、アプリケーションのコンポジション ルートです。そこにすべての依存関係を登録する必要があります。そしてそこだけ。コンポジション ルートの外部でコンテナを直接参照しないでください。

クラスに依存関係がある場合は、コンストラクター注入のようなパターンを使用してその依存関係を注入する必要があります。

静的クラスを使用しないでください。静的は依存関係の注入とテスト容易性を殺し、依存関係を隠して、すべてがどこからでも参照されるようにします。

ロガー ファサードをコンストラクタ パラメータにします。エラー処理ブロックでも同じことができます。

コンテナーを ServiceLocator として使用しないでください。これは、最新のソフトウェア アーキテクチャではアンチパターンと見なされます。

于 2012-11-04T20:31:14.943 に答える