gpt4 book ai didi

asp.net-web-api - 使用 Unity 根据其使用者/上下文依赖项注入(inject)特定依赖项

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

我在我的 Web API 项目中使用 Nlog 作为日志记录框架,并使用 Unity 和 IoC 容器。

我有 LoggingService 类,它将类名作为参数并返回 NLog 的实例。为此,我使用了依赖注入(inject)。

问题:我很困惑如何将类名传递给我的 LoggingService 类?

代码:

using NLog;

namespace Portal.Util.Logging
{
public class LoggingService : ILoggingService
{
private readonly ILogger _logger;

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

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

public interface ILoggingService
{
void FirstLevelServiceLog(string log);
}
}

服务层:(这是从 Controller 调用的)

public class MyService : IMyService
{
private readonly ILoggingService _loggingService;

public MyService(ILoggingService loggingService)
{
_loggingService = loggingService
}

public DoSomething()
{
_loggingService.FirstLevelServiceLog("Debug");
}
}

团结:

var container = new UnityContainer();
container.RegisterType<ILoggingService, LoggingService>(new InjectionConstructor(""))
/* Not sure on how to pass the class name here? */

最佳答案

这看起来像是一个隐藏在 XY problem 背后的设计问题。 。

日志记录服务需要进行一些重构,以便更容易地注入(inject)所需的行为。

引入一个从基础ILoggingService派生的附加通用接口(interface)

public interface ILoggingService<TType> : ILoggingService {

}

public interface ILoggingService {
void FirstLevelServiceLog(string log);
}

重构当前实现以依赖于服务的通用版本

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

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

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

这将允许使用类型参数来确定日志管理器的类名称

现在,那些依赖于日志记录服务的人可以通过构造函数注入(inject)明确其依赖关系

public class MyService : IMyService {
private readonly ILoggingService _loggingService;

public MyService(ILoggingService<MyService> loggingService) {
_loggingService = loggingService
}

public DoSomething() {
_loggingService.FirstLevelServiceLog("Debug");
}
}

请注意,唯一需要重构的是构造函数的通用参数,因为通用记录器是从基础 ILoggingService 派生的。

日志记录服务抽象最终可以使用开放泛型来注册其实现

var container = new UnityContainer();    
container.RegisterType(typeof(ILoggingService<>), typeof(LoggingService<>));

这样就不需要为系统中使用的每个记录器注册单独的实现。

关于asp.net-web-api - 使用 Unity 根据其使用者/上下文依赖项注入(inject)特定依赖项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52654616/

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