gpt4 book ai didi

c# - Web API - 使用 Unity 在 ServiceContainer 中注入(inject)依赖项

转载 作者:行者123 更新时间:2023-12-02 09:10:40 24 4
gpt4 key购买 nike

我正在使用ExceptionLogger来处理所有全局异常。我的继承类需要注入(inject)依赖项以供 Nlog 调用。

public class NLogExceptionLogger : ExceptionLogger
{
private readonly ILoggingService _loggingService;

public NLogExceptionLogger(ILoggingService<NLogExceptionLogger> loggingService)
{
_loggingService = loggingService;
}

public override void Log(ExceptionLoggerContext context)
{
_loggingService.FirstLevelServiceLog(context.Exception.StackTrace);
}
}

日志服务类:

public class LoggingService<T> : ILoggingService<T>
{
private readonly ILogger _logger;

public LoggingService()
{
string currentClassName = typeof(T).Name;
_logger = LogManager.GetLogger(currentClassName);
}

public void FirstLevelServiceLog(string log)
{
_logger.Log(LogLevel.Debug, log);
}
}

我的Unity代码:

public static UnityContainer RegisterComponents()
{
var container = new UnityContainer();
container.RegisterType(typeof(ILoggingService<>), typeof(LoggingService<>))
}

我正在通过以下方式全局注册ExceptionLogger:(在这一行我收到错误)

config.Services.Add(typeof(IExceptionLogger), typeof(NLogExceptionLogger));
//Register Dependency Container
config.DependencyResolver = new UnityDependencyResolver(UnityConfig.RegisterComponents());

我在运行时收到以下错误:

System.ArgumentException: 'The type RuntimeType must derive from IExceptionLogger.'

我的假设是我没有正确注册 NLogExceptionLogger 的依赖项。

关于如何在注册服务时解决依赖关系有什么想法吗?

最佳答案

将服务添加到 ServicesContainer 时,您可以使用服务实例添加类型。

假设已经设置了依赖解析器,如果实例具有依赖关系,则可以使用它来解析实例。

var logger = config.DependencyResolver.GetService(typeof(NLogExceptionLogger));
config.Services.Add(typeof(IExceptionLogger), logger);

异常记录器和异常处理程序之间也有区别。

我建议查看以下引用链接,以确定哪一个适合您的需求。

引用Global Error Handling in ASP.NET Web API 2

关于c# - Web API - 使用 Unity 在 ServiceContainer 中注入(inject)依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52709380/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com