4

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

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

无法解析 EnterpriseLibraryContainer

我在stackoverflow上找到了另一个关于 EnterpriseLibraryCONtainer 的帖子

在 Enterprise Library 的升级说明中指出:

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

Enterprise Library 版本 6 中所有块的引导代码都已更改。这些块不再使用 Unity 来管理初始化和配置,每个块现在都包含自己的引导代码。对 EnterpriseLibraryContainer.Current.GetInstance 方法的任何调用以从 Enterprise Library 块之一解析类型都应替换为块特定的引导代码。例如,要根据 app.config 文件中的配置创建 LogWriter 实例,现在可以使用以下代码: LogWriterFactory logWriterFactory = new LogWriterFactory(); var logWriter = logWriterFactory.Create();

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

IUnityContainer 容器 = 新的 UnityContainer?

谢谢你的帮助

4

2 回答 2

6

典型的方法是引导块,向 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,另一种方法是引导块,然后将调用替换为EnterpriseLibraryContainer.Current.GetInstance<>()静态外观方法(例如Logger.Write())。

于 2013-06-26T16:41:22.147 回答
1

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

// app.config

<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>

// 我的记录器类使用 System; 使用 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");

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

于 2014-02-05T17:34:34.720 回答