【问题标题】:Upgrade to Enterprise Library 6.0 giving issues with 'EnterpriseLibraryContainer'升级到 Enterprise Library 6.0,出现“EnterpriseLibraryContainer”问题
【发布时间】:2013-06-23 08:14:13
【问题描述】:

升级到 Enterprise Library 6.0 后,我遇到了以下问题:

私有静态 IUnityContainer 容器 = EnterpriseLibraryContainer.Current.GetInstance();

无法解析 EnterpriseLibraryContainer

我在stackoverflow 上发现了另一个关于 EnterpriseLibraryCONtainer 的帖子

在企业库的升级说明中写道:

“当前上下文中不存在名称‘EnterpriseLibraryContainer’

所有模块的引导代码在版本 6 中已更改 企业图书馆。块不再使用 Unity 来管理 初始化和配置,现在每个块都包含自己的 引导代码。任何呼叫 EnterpriseLibraryContainer.Current.GetInstance 方法来解析一个 企业库块之一的类型应替换为 块特定的引导代码。例如,创建一个 LogWriter 实例基于 app.config 文件中的配置,您现在可以 使用以下代码: LogWriterFactory logWriterFactory = new LogWriterFactory(); var logWriter = logWriterFactory.Create();

但我不知道在 IUnityContainer 的情况下如何处理这个问题。 我可以使用

IUnityContainer 容器 = 新 UnityContainer?

感谢您的帮助

【问题讨论】:

  • 你现在在使用 Unity 吗?

标签: c# enterprise-library


【解决方案1】:

典型的方法是引导块,向 Unity 注册适当的对象并让 Unity 注入依赖项。

例如,如果您正在使用日志记录,那么您将引导该块:

LogWriterFactory logWriterFactory = new LogWriterFactory(); 
LogWriter logWriter = logWriterFactory.Create();

并向 UnityContainer 注册 LogWriter:

IUnityContainer container = new UnityContainer();
// Register LogWriter as singleton
container.RegisterInstance<LogWriter>(logWriter);

如果您将 EnterpriseLibraryContainer 用作服务定位器并希望继续使用相同的方法,那么您可以创建/包装服务定位器实现或创建静态帮助器方法。 Unity 附带 UnityServiceLocator,您可以重复使用它。

如果您不使用 Unity,另一种方法是引导块,然后用静态外观方法(例如 Logger.Write())替换对 EnterpriseLibraryContainer.Current.GetInstance&lt;&gt;() 的调用。

【讨论】:

    【解决方案2】:

    我真的为此苦苦挣扎,所以这是我从 Enterprise 5 升级到 v6(流利)的工作。我提到在 Codeplex Migration PDF 中它仍然显示 EnterpriseLibraryContainer,它不再有效。

    // 应用程序配置

    <configSections>
           <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging, Version=6.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" requirePermission="true" />
    </configSections>
    

    // 我的记录器类 使用系统; 使用 Microsoft.Practices.EnterpriseLibrary.Common.Configuration; 使用 Microsoft.Practices.EnterpriseLibrary.Logging;

    /// <summary>
    /// Set up the Enterprise logging class
    /// </summary>
    public static class Logging
    {
        /// <summary>
        /// Define the logging parameters
        /// </summary>
        public static void DefineLogger()
        {
            var builder = new ConfigurationSourceBuilder();
    
            string loggerPath = Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData);
    
            builder.ConfigureLogging()
                   .WithOptions
                     .DoNotRevertImpersonation()
                   .LogToCategoryNamed("LogWriter")
                   .WithOptions.SetAsDefaultCategory()
                     .SendTo.RollingFile("Rolling Flat File Trace Listener")
                     .RollAfterSize(1000)
                       .FormatWith(new FormatterBuilder()
                         .TextFormatterNamed("Text Formatter")
                           .UsingTemplate(@"Timestamp: {timestamp}{newline}Message: {message},{newline}Category: {category},{newline}Severity: {severity},{newline}Title:{title},{newline}ProcessId: {localProcessId},{newline}Process Name: {localProcessName},{newline}Thread Name: {threadName}"))
                           .ToFile(loggerPath + Properties.Settings.Default.LogFileFolder);
    
            // Reference app.config
            using (DictionaryConfigurationSource configSource = new DictionaryConfigurationSource())
            {
                builder.UpdateConfigurationWithReplace(configSource);
    
                Logger.SetLogWriter(new LogWriterFactory(configSource).Create());
            }
        }
    }
    

    最后在任何旧异常中:

    Logger.Write("This is my log");
    

    我希望这有助于节省大量时间。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-07-23
      • 1970-01-01
      • 1970-01-01
      • 2011-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多