【问题标题】:How to Integrate Prism, Unity, and Enterprise Library如何集成 Prism、Unity 和 Enterprise Library
【发布时间】:2012-10-23 06:34:35
【问题描述】:

我正在构建一个 WPF 应用程序。我正在使用 Prism 4 和 Unity。我想向应用程序中添加两个 Enterprise Library 5 块,即日志记录和异常处理。我的基础设施类中有一个支持 ILoggerFacade 的单例 LoggerFacadeCustom.cs,我在引导程序中创建了它,它正在生成日志文件。它在其构造函数中“通知”了一个统一容器(第二个代码块)

在哪里为 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
  }

【问题讨论】:

    标签: prism unity-container enterprise-library prism-4


    【解决方案1】:

    您的引导程序是您的应用程序的Composition Root。您应该在那里注册所有依赖项。而且只有那里。你不应该直接在组合根之外引用容器。

    如果您的类有依赖项,您应该使用constructor injection 之类的模式注入该依赖项。

    不要使用静态类。静态会扼杀依赖注入和可测试性,并将依赖隐藏到可以从任何地方引用所有内容的地步。

    使您的记录器外观成为构造函数参数。您可以对错误处理块执行相同的操作。

    不要将容器用作 ServiceLocator。这被认为是anti-pattern in modern software architecture

    【讨论】:

    • 微软的 Prism 书建议在每个模块中使用容器以实现统一。向我解释一个模块如何在不使用容器的情况下注册接口?但是,您应该使用 DI 获取该容器,而不是自己创建它
    • @Alan 您可以将该配置外包到派生自UnityContainerExtension 的特殊类中,并捆绑模块的配置。让您的引导程序搜索这些类并将它们添加到您的单个容器实例中。或者您可以将容器实例注入模块并在那里进行配置。我认为这也是一个有效的捷径。
    • 对我来说,每个模块都有一个IModule类,通过构造函数注入容器。然后 Initialize 注册类型并解析 Module 拥有的任何服务。
    猜你喜欢
    • 2023-03-22
    • 1970-01-01
    • 2023-04-04
    • 2016-12-06
    • 2011-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多