2017-04-04 85 views
1

在我的ASP.NET Core项目中,我写了ILoggerFactory的扩展,它增加了一个自定义的ILoggerProvider。 (类似NLog.Extensions.Logging在ASP.NET Core中处理ILoggerFactory

我在Startup.cs添加此:

loggerFactory.AddRabbitLogger(Configuration.GetSection(nameof(WebLoggerOptions))); 

测井工作完美,但是,它发送消息给RabbitMQ的,这意味着它打开一个连接和信道。这些不能继续开放,所以我关闭Dispose通道和连接(ILoggerProvider已经从IDisposable继承)

我的测试是成功的,但问题是,我的测试输出始终显示此错误

Error while unloading appdomain. (Exception from HRESULT: 0x80131015) 

的另一个问题是测试完成后需要几秒钟才能显示该错误,因此我无法启动任何新测试。

有没有办法在我的测试中触发处置记录器提供程序?

这是我的集成测试的代码。正如你所看到的,我做了处置在TearDown

集成测试

public abstract class TestBase 
{ 
    private TestServer _server; 
    protected HttpClient TestHttpClient { get; private set; } 

    [SetUp] 
    protected void BaseSetup() 
    { 
     _server = new TestServer(new WebHostBuilder() 
      .UseStartup<Startup>()); 
     TestHttpClient = _server.CreateClient(); 
    }  

    [TearDown] 
    public void TearDown() 
    { 
     TestHttpClient.Dispose(); 
     _server.Dispose(); 
    } 
} 

public class MyTestClass : TestBase 
{ 
    [Test] 
    public async Task SendTest() 
    { 
     requestUrl = "api/ControllerName/Mehthod"; 
     var response = await TestHttpClient.PostAsync(requestUrl, pardotFormCommand, GetMediaTypeFormatter()); 
     response.StatusCode.Should().Be(HttpStatusCode.OK);    
    }   
} 
+0

你还没有提供任何代码,但我的猜测是,你可不能在拆卸时手动处理LoggerFactory? –

+0

你是使用内置的DI容器还是其他的东西? – Dealdiane

+0

另外,你可以发布你的记录器类的片段和测试? – Dealdiane

回答

0

我能够改变我的ILoggerFactory扩展库来解决这个问题。 我也有使用此扩展的控制台应用程序的问题,但只有当我使用多个服务与​​实现。

在供应商(衍生自ILoggerProvider)有一个CreateLogger方法。我发现在一个提供者中,你可以有多个记录器(例如,你的每个asp.net控制器或控制台应用程序中的每个服务都有一个)。我错误地认为每个记录器都有自己的提供者,我只处理了一个​​(最后一个)。

当我改变了我的ILoggerProvider代码到这一点,我不再有挂起或错误,在我的单元测试

public ILogger CreateLogger(string categoryName) 
{ 
    var companyLogger = new CompanyLogger(categoryName, _loggerOptions); 
    _companyLoggers.Add(companyLogger); 

    return companyLogger; 
} 

public void Dispose() 
{ 
    foreach (var logger in _companyLoggers) 
    { 
     logger.Dispose(); 
    }   
} 

总之,如果你想写一个自定义ILoggerFactory与​​类必须您必须将​​对象保存在您的ILoggerProvider的私人列表中,并在调用Dispose时将其全部弃置。如果你的​​不需要像NLog那样处理,你不必担心这一点。