【问题标题】:Dependency Injection with ILogger and Abstract Classes .NET Core [duplicate]使用 ILogger 和抽象类 .NET Core 进行依赖注入 [重复]
【发布时间】:2023-03-06 21:44:01
【问题描述】:

我正在为我的 .NET Core 项目使用存储库模式。我有一个基础存储库:

public abstract class RepositoryBase<T> : IRepositoryBase<T> where T : class
{
    protected DbContext MyContext { get; set; }

    public RepositoryBase(DbContext context)
    {
        MyContext = context;
    }

}

然后我有从基类派生的实体特定存储库。例如:

   public class ClientRepository : RepositoryBase<Client>, IClientRepository
{
    public ClientRepository(DbContext context)
       : base(context)
    {
    }

然后我有一个存储库包装器,它实例化所有这些实体特定的存储库。

我想让我的所有存储库都可以访问我通过依赖注入配置的记录器。但是,我的记录器似乎需要一种类型,例如

ILogger<ClientRepository>

我以通用形式将记录器添加到基类中,而在实体类中我做了 ILogger 的特定形式。但是,在存储库包装器构造函数中,我现在需要声明并注入所有这些不同类型的 ILogger。在构建存储库包装器的任何地方,我都需要将所有这些都添加为 args。

谁能阐明注入 ILogger 的正确方法,并可以说是通过抽象类和派生类将其移动到“下游”?

【问题讨论】:

  • 声明 ILogger 对象,例如 _logger,作为基础存储库中的受保护成员,并将其用作子存储库中的 this._logger

标签: c# asp.net-core ilogger


【解决方案1】:

有两种选择。我不知道有什么实际区别。

选项 A ILogger

ILogger&lt;T&gt; 是一个ILogger

public interface ILogger<out TCategoryName> : ILogger

你的基础仓库可以接受ILogger

选项 B ILogger&lt;BaseClass&gt;

ILogger&lt;DerivedClass&gt; 也是ILogger&lt;BaseClass&gt; 所以在你的情况下ILogger&lt;ClientRepository&gt;ILogger&lt;RepositoryBase&lt;Client&gt;&gt;

基础仓库可以接受ILogger&lt;RepositoryBase&lt;Client&gt;&gt;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-12-03
    • 1970-01-01
    • 2020-12-03
    • 2017-06-09
    • 1970-01-01
    • 2018-09-13
    • 2015-09-12
    相关资源
    最近更新 更多