2013-06-26 53 views
4

升级到企业库6.0我有以下问题后:升级到企业图书馆6.0“EnterpriseLibraryContainer”给人的问题

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

无法解析EnterpriseLibraryContainer

我发现在另一个帖子里谈到的EnterpriseLibraryCOntainer上stackoverflow

在企业库的升级说明它指出:

“这个名字“ EnterpriseLibraryContainer'在当前上下文中不存在

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

但我不知道如何处理这种情况下的IUnityContainer。 我可以只使用

IUnityContainer container = new UnityContainer?

感谢您的帮助

+0

你现在在使用Unity吗? –

+0

是的,我正在使用Unity –

回答

4

典型的做法是引导块,注册使用Unity合适的对象,并有统一注入的依赖关系。

例如,如果您使用的日志记录,那么你会引导块:

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

并注册与UnityContainer的日志写:

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

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

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

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> 
使用系统

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

我希望这有助于节省了很多时间。