升级到Enterprise Library 6.0会出现“EnterpriseLibraryContainer”问题

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

private static IUnityContainer container = EnterpriseLibraryContainer.Current.GetInstance();

无法解析EnterpriseLibraryContainer

我在stackoverflow上发现了另一篇关于EnterpriseLibraryCOntainer的post

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

谢谢你的帮助

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

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

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

并使用UnityContainer注册LogWriter:

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

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

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

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

// app.config

  

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

 ///  /// Set up the Enterprise logging class ///  public static class Logging { ///  /// Define the logging parameters ///  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"); 

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