使用 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>
。我在下面发布了我的解决方法作为解决方案。
原来我不得不用不同的方式解决我的问题:
- 我从 Microsoft.Extensions.Logging.Testing
复制了 XunitLogger
我创建了一个通用版本:
public class XunitLogger<T> : XunitLogger, ILogger<T>
{
public XunitLogger(ITestOutputHelper output) : base(output, typeof(T).Name, LogLevel.Information)
{
}
}
我注册了测试输出助手和记录器:
public TestBase(ITestOutputHelper testOutputHelper)
{
Container.RegisterInstance(testOutputHelper);
Container.Register(typeof(ILogger<>), typeof(XunitLogger<>));
}
这里的关键是 ILogger<T>
必须由通用 class 实现,例如XunitLogger<T>
。现在消息已记录到我的测试输出中。
我想配置一个记录到 xUnit 测试输出的记录器,并且应该替换所有 ILogger<T>
依赖项。据我所知,解决这个问题的方法是使用带有工厂方法的通用服务。
当使用Microsoft.Extensions.DependencyInjection
时,我可以做以下事情:
services.AddTransient(typeof(ILogger<>),
factory => factory.GetRequiredService<LoggerFactory>().CreateLogger("TestLogger"));
如何使用 LightInject 实现同样的效果?
编辑: 我的示例不起作用,因为创建的记录器无法转换为 ILogger<T>
。我在下面发布了我的解决方法作为解决方案。
原来我不得不用不同的方式解决我的问题:
- 我从 Microsoft.Extensions.Logging.Testing 复制了
我创建了一个通用版本:
public class XunitLogger<T> : XunitLogger, ILogger<T> { public XunitLogger(ITestOutputHelper output) : base(output, typeof(T).Name, LogLevel.Information) { } }
我注册了测试输出助手和记录器:
public TestBase(ITestOutputHelper testOutputHelper) { Container.RegisterInstance(testOutputHelper); Container.Register(typeof(ILogger<>), typeof(XunitLogger<>)); }
XunitLogger
这里的关键是 ILogger<T>
必须由通用 class 实现,例如XunitLogger<T>
。现在消息已记录到我的测试输出中。