首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将企业库5迁移到6

将企业库5迁移到6
EN

Stack Overflow用户
提问于 2016-03-29 23:40:03
回答 1查看 5.5K关注 0票数 4

试图从企业图书馆 5.0迁移到6.0,我遇到了一些麻烦。也许这能帮到别人。

下面的配置是数据库(静默)异常日志记录的一个示例:

代码语言:javascript
复制
<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 5.0,在asp.net MVC应用程序中使用所有这些都非常简单:

代码语言:javascript
复制
// ...
catch (Exception ex)
{
    if (ExceptionPolicy.HandleException(ex, "UiPolicy")) throw;
    // do something else
}

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

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

那么,该怎么办?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-03-29 23:40:03

循序渐进

为了摆脱这个异常(归功于兰迪的回答),我们必须使用ExceptionManager,在我的例子中,通过工厂。我在global.asax的Application_Start()方法中使用了这个方法:

代码语言:javascript
复制
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方法。

为了让这件事消失,我补充道

代码语言:javascript
复制
var logwriterFactory = new LogWriterFactory(source);
var logWriter = logwriterFactory.Create();
Logger.SetLogWriter(logWriter);

现在它说

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

logwriterFactory.Create()上。所以还有一件事要补充:

代码语言:javascript
复制
DatabaseFactory.SetDatabaseProviderFactory(new DatabaseProviderFactory(source));

完全解

我现在的Application_Start()

代码语言:javascript
复制
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);
}

当配置和实际异常处理代码保持不变时:

代码语言:javascript
复制
ExceptionPolicy.HandleException(exceptionToHandle, "UiPolicy");
票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/36297054

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档