gpt4 book ai didi

c# - 在 ASP.NET 中使用依赖注入(inject)和工厂模式传递服务

转载 作者:太空狗 更新时间:2023-10-30 00:01:17 24 4
gpt4 key购买 nike

我正在使用 ASP.NET Core,我知道框架已经提供了这样的 Logging 机制,但以此来说明我的问题。

我正在使用一种工厂模式来构建 Logger 类,因为我不知道日志记录的类型(因为它存储在数据库中)。

ILogger 合约

Log(string msg)

然后 LoggerFactory 将根据从 DB 传递的参数创建一个 Logger 后返回一个 ILogger:

public class LoggerFactory
{
public static Contracts.ILogger BuildLogger(LogType type)
{
return GetLogger(type);
}

//other code is omitted, GetLogger will return an implementation of the related logger

现在,当我需要使用 Logger 时,我必须这样做:

  public class MyService
{
private ILogger _logger
public MyService()
{
_logger = LoggerFactory.BuildLogger("myType");
}

但是,我打算保留我的类而不进行任何实例化,我需要在 MyService 中使用 Constructor DI,并且我需要在 Startup 上注入(inject)所有依赖项:

    services.AddTransient<Contracts.ILogger, LoggerFactory.BuildLogger("param") > ();

但这行不通,我们需要通过一个具体的实现。如何使用 DI 实现该功能,是否有更好的实现方法?

最佳答案

您的方法有几个错误:

相反,您的服务应如下所示:

public class MyService
{
private ILogger _logger;
public MyService(ILogger logger)
{
_logger = logger;
}
}

这极大地简化了所有依赖于 ILogger 的消费者。这也意味着为 MyService 获取正确的 ILogger 成为 Composition Root 的责任。 ,这是获得这些知识的正确位置。

但这确实意味着您可能需要从 ASP.NET Core 的内置 DI 容器转移到功能更丰富的 DI 库,因为内置容器无法为ILogger 同时让库自动连接其他构造函数依赖项。

使用 ASP.NET Core DI 容器,您只能使用委托(delegate)手动连接您的服务。例如:

services.AddTransient<MyService>(c => new MyService(
BuildLogger(typeof(MyService).Name),
c.GetRequiredService<ISomeOtherDependency>(),
c.GetRequiredService<IYetAnotherOne>());

关于c# - 在 ASP.NET 中使用依赖注入(inject)和工厂模式传递服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40513388/

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