升级到Enterprise Library 6.0后,我遇到以下问题:
private static IUnityContainer container = EnterpriseLibraryContainer.Current.GetInstance();
上发现了另一篇关于EnterpriseLibraryCOntainer的帖子无法解析EnterpriseLibraryContainer
在Enterprise Library的升级说明中,它指出:
“当前上下文中不存在名称'EnterpriseLibraryContainer'
版本6中所有块的引导代码已更改 企业图书馆。这些块不再使用Unity来管理 初始化和配置,现在每个块都包含它自己的 引导代码。任何电话 EnterpriseLibraryContainer.Current.GetInstance方法解决了 其中一个企业库块的类型应替换为 块特定的引导代码。例如,要创建LogWriter 基于app.config文件中的配置的实例,您现在可以 使用以下代码:LogWriterFactory logWriterFactory = new LogWriterFactory(); var logWriter = logWriterFactory.Create();
但我不知道在IUnityContainer的情况下如何处理这个问题。 我可以使用
吗?IUnityContainer container = new UnityContainer?
感谢您的帮助
答案 0 :(得分:5)
典型的方法是引导块,使用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()
的调用。
答案 1 :(得分: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");
我希望这有助于节省大量时间。