将Enterprise Library 5迁移到6版本

4

我正在尝试从企业库5.0升级到6.0,在过程中遇到了一些问题。也许这篇文章能够帮助其他人。

以下配置示例是用于将异常(静默式)记录到数据库中:

<configSections>
  <section name="loggingConfiguration" type="Microsoft.Practices.EnterpriseLibrary.Logging.Configuration.LoggingSettings, Microsoft.Practices.EnterpriseLibrary.Logging" requirePermission="true" />
  <section name="exceptionHandling" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Configuration.ExceptionHandlingSettings, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling" requirePermission="true" />
</configSections>
<loggingConfiguration name="" tracingEnabled="true" defaultCategory="General">
  <listeners>
    <add name="Database Trace Listener" type="Microsoft.Practices.EnterpriseLibrary.Logging.Database.FormattedDatabaseTraceListener, Microsoft.Practices.EnterpriseLibrary.Logging.Database"
         listenerDataType="Microsoft.Practices.EnterpriseLibrary.Logging.Database.Configuration.FormattedDatabaseTraceListenerData, Microsoft.Practices.EnterpriseLibrary.Logging.Database"
         databaseInstanceName="LogContext" writeLogStoredProcName="WriteLog"
         addCategoryStoredProcName="AddCategory" formatter="Text Formatter" />
  </listeners>
  <formatters>
    <add type="Microsoft.Practices.EnterpriseLibrary.Logging.Formatters.TextFormatter, Microsoft.Practices.EnterpriseLibrary.Logging"
         template="Timestamp: {timestamp}{newline}..."
         name="Text Formatter" />
  </formatters>
  <categorySources>
    <add switchValue="All" name="Exception">
      <listeners>
        <add name="Database Trace Listener" />
      </listeners>
    </add>
  </categorySources>
</loggingConfiguration>
<exceptionHandling>
  <exceptionPolicies>
    <add name="UiPolicy">
      <exceptionTypes>
        <add name="All Exceptions" type="System.Exception, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
             postHandlingAction="None">
          <exceptionHandlers>
            <add name="Logging Exception Handler" type="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging.LoggingExceptionHandler, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging"
                 logCategory="Exception" eventId="100" severity="Error" title="Enterprise Library Exception Handling"
                 formatterType="Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.TextExceptionFormatter, Microsoft.Practices.EnterpriseLibrary.ExceptionHandling"
                 priority="0" />
          </exceptionHandlers>
        </add>
      </exceptionTypes>
    </add>
  </exceptionPolicies>
</exceptionHandling>

我正在使用以下版本为5.0.414.0的程序集:

Microsoft.Practices.EnterpriseLibrary.ExceptionHandling Microsoft.Practices.EnterpriseLibrary.ExceptionHandling.Logging Microsoft.Practices.EnterpriseLibrary.Logging Microsoft.Practices.EnterpriseLibrary.Logging.Database

在 Enterprise Library 5.0 中,将所有这些用于 asp.net MVC 应用程序非常容易:

// ...
catch (Exception ex)
{
    if (ExceptionPolicy.HandleException(ex, "UiPolicy")) throw;
    // do something else
}

将程序集升级到Enterprise Library 6.0后,我收到了以下异常消息:

必须使用SetExceptionManager方法在ExceptionPolicy类中设置一个ExceptionManager。

那么,该怎么办呢?

1个回答

6

步骤

为了消除这个异常(感谢Randy的回答),需要使用ExceptionManager,在我的情况下通过工厂实现。我在global.asax的Application_Start()方法中使用它:

protected void Application_Start()
{
    IConfigurationSource source = ConfigurationSourceFactory.Create();

    var exceptionPolicyFactory = new ExceptionPolicyFactory(source);
    var exceptionManager = exceptionPolicyFactory.CreateManager();
    ExceptionPolicy.SetExceptionManager(exceptionManager);
}

但是仅凭我的处理和日志设置还不够。我现在在exceptionPolicyFactory.CreateManager()处得到以下异常:

Logger静态类的LogWriter未设置。调用Logger.SetLogWriter方法来设置它。

为了解决这个问题,我添加了以下代码:

var logwriterFactory = new LogWriterFactory(source);
var logWriter = logwriterFactory.Create();
Logger.SetLogWriter(logWriter);

现在它说:

未为静态 DatabaseFactory 设置数据库提供程序工厂。通过调用 DatabaseFactory.SetProviderFactory 方法设置提供程序工厂或通过调用 DatabaseFactory.SetDatabases 方法指定自定义映射来设置提供程序工厂。

位于 logwriterFactory.Create() 上。因此还需要添加一件事:

DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory(source));

完整解决方案

现在我的Application_Start()代码如下:

protected void Application_Start()
{
    IConfigurationSource source = ConfigurationSourceFactory.Create();
    DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory(source));

    var logwriterFactory = new LogWriterFactory(source);
    var logWriter = logwriterFactory.Create();
    Logger.SetLogWriter(logWriter);

    var exceptionPolicyFactory = new ExceptionPolicyFactory(source);
    var exceptionManager = exceptionPolicyFactory.CreateManager();
    ExceptionPolicy.SetExceptionManager(exceptionManager);
}

虽然配置和实际的异常处理代码保持不变:

ExceptionPolicy.HandleException(exceptionToHandle, "UiPolicy");

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接