使用 LightInject,如何使用工厂方法注册通用服务?

Using LightInject, how can I register a generic service with a factory method?

我想配置一个记录到 xUnit 测试输出的记录器,并且应该替换所有 ILogger<T> 依赖项。据我所知,解决这个问题的方法是使用带有工厂方法的通用服务。

当使用Microsoft.Extensions.DependencyInjection时,我可以做以下事情:

services.AddTransient(typeof(ILogger<>), 
  factory => factory.GetRequiredService<LoggerFactory>().CreateLogger("TestLogger"));

如何使用 LightInject 实现同样的效果?

编辑: 我的示例不起作用,因为创建的记录器无法转换为 ILogger<T>。我在下面发布了我的解决方法作为解决方案。

原来我不得不用不同的方式解决我的问题:

  1. 我从 Microsoft.Extensions.Logging.Testing
  2. 复制了 XunitLogger
  3. 我创建了一个通用版本:

    public class XunitLogger<T> : XunitLogger, ILogger<T>
    {
        public XunitLogger(ITestOutputHelper output) : base(output, typeof(T).Name, LogLevel.Information)
        {
        }
    }
    
  4. 我注册了测试输出助手和记录器:

    public TestBase(ITestOutputHelper testOutputHelper)
    {
        Container.RegisterInstance(testOutputHelper);
        Container.Register(typeof(ILogger<>), typeof(XunitLogger<>));
    }
    

这里的关键是 ILogger<T> 必须由通用 class 实现,例如XunitLogger<T>。现在消息已记录到我的测试输出中。