Web API-使用Unity在ServiceContainer上注入依赖项

时间:2018-10-08 20:05:48

标签: c# asp.net-web-api dependency-injection unity-container

我正在使用ExceptionLogger处理所有全局异常。我的继承类要求注入依赖项以供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);
    }
}

LoggingService类:

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:“类型RuntimeType必须从IExceptionLogger派生。”

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

关于在注册服务时如何解决依赖性的任何想法?

1 个答案:

答案 0 :(得分:3)

将服务添加到ServicesContainer时,将类型与服务实例一起添加。

假定已经安装了依赖关系解析程序,如果实例具有依赖关系,则可以用来解析实例。

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

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

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

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