Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/310.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 注入记录器实例的.Net Core 2.2 AutoFac寄存器依赖项_C#_Asp.net Core_Autofac - Fatal编程技术网

C# 注入记录器实例的.Net Core 2.2 AutoFac寄存器依赖项

C# 注入记录器实例的.Net Core 2.2 AutoFac寄存器依赖项,c#,asp.net-core,autofac,C#,Asp.net Core,Autofac,工具版本 asp.net核心2.2 Autofac 4.9.2 问题 我正在尝试将一个记录器实例注入到一个类中,该类已被Autofac配置为依赖项注入 设置 我有一个查询数据库的类。该类中有一个由Autofac注入的连接字符串。下面的设置工作正常 类而不插入记录器: 公共类项目查询 :IItemQueries { 私有只读字符串_connectionString=default(字符串); 公共项查询(字符串连接字符串) { _connectionString=!string.IsNullO

工具版本

  • asp.net核心2.2
  • Autofac 4.9.2
问题

我正在尝试将一个记录器实例注入到一个类中,该类已被Autofac配置为依赖项注入

设置

我有一个查询数据库的类。该类中有一个由Autofac注入的连接字符串。下面的设置工作正常

类而不插入记录器:

公共类项目查询
:IItemQueries
{
私有只读字符串_connectionString=default(字符串);
公共项查询(字符串连接字符串)
{
_connectionString=!string.IsNullOrWhiteSpace(connectionString)?connectionString:抛出新的ArgumentNullException(nameof(connectionString));
}
公共异步任务GetItemAsync(int id)
{
使用(var connection=newsqlconnection(_connectionString))
{
connection.Open();
var result=await connection.QueryAsync(
@“选择*
来自dbo.items
其中Id=@Id”
,新{id}
);
if(result.AsList().Count==0)
{
抛出新的KeyNotFoundException();
}
返回MapItem(result.FirstOrDefault());
}
}
private ItemViewModel MapItem(动态结果)
{
返回新的ItemViewModel()
{
Id=result.Id,
Name=result.Name
};
}
}
以下是我在Autofac注册该类的方式:

公共类ItemModule
:自动传真模块
{
公共字符串QueriesConnectionString{get;}
公共项模块(字符串queriesConnectionString)
{
QueriesConnectionString=QueriesConnectionString;
}
受保护的覆盖无效负载(ContainerBuilder builder)
{

Register(c=>newitemquerys(queryconnectionstring))//您需要使用Autofac的功能“Factory”

以下是您与Factory的解决方案设置

private readonly ILogger<ItemQueries> _logger;
private readonly string _connectionString = default(string);

public delegate ItemQueries Factory(string connectionString); // --> here, you create the delegate factory

// connectionString needs to be the first parameter
public ItemQueries(string connectionString, ILogger<ItemQueries> logger) 
{
    _logger = logger;
    _connectionString = !string.IsNullOrWhiteSpace(connectionString) ? connectionString : throw new ArgumentNullException(nameof(connectionString));
}
专用只读ILogger\u记录器;
私有只读字符串_connectionString=default(字符串);
公共委托项查询工厂(字符串连接字符串);//-->在这里,您可以创建委托工厂
//connectionString必须是第一个参数
公共项查询(字符串连接字符串、ILogger记录器)
{
_记录器=记录器;
_connectionString=!string.IsNullOrWhiteSpace(connectionString)?connectionString:抛出新的ArgumentNullException(nameof(connectionString));
}
模块设置应如下所示:

public class ItemModule: Autofac.Module
{
    public string QueriesConnectionString { get; }

    public ItemModule(string queriesConnectionString)
    {
        QueriesConnectionString = queriesConnectionString;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ItemQueries>();  // --> not sure if needed

        builder.Register(c => 
        {
           var factory = c.Resolve<ItemQueries.Factory>();
           return factory.Invoke(QueriesConnectionString);
        })  
        .As<IItemQueries>()
        .InstancePerLifetimeScope();
    }
}
公共类ItemModule:Autofac.Module
{
公共字符串QueriesConnectionString{get;}
公共项模块(字符串queriesConnectionString)
{
QueriesConnectionString=QueriesConnectionString;
}
受保护的覆盖无效负载(ContainerBuilder builder)
{
builder.RegisterType();//-->不确定是否需要
builder.Register(c=>
{
var factory=c.Resolve();
返回factory.Invoke(queryConnectionString);
})  
.As()
.InstancePerLifetimeScope();
}
}

您需要使用Autofac的“工厂”功能

以下是您与Factory的解决方案设置

private readonly ILogger<ItemQueries> _logger;
private readonly string _connectionString = default(string);

public delegate ItemQueries Factory(string connectionString); // --> here, you create the delegate factory

// connectionString needs to be the first parameter
public ItemQueries(string connectionString, ILogger<ItemQueries> logger) 
{
    _logger = logger;
    _connectionString = !string.IsNullOrWhiteSpace(connectionString) ? connectionString : throw new ArgumentNullException(nameof(connectionString));
}
专用只读ILogger\u记录器;
私有只读字符串_connectionString=default(字符串);
公共委托项查询工厂(字符串连接字符串);//-->在这里,您可以创建委托工厂
//connectionString必须是第一个参数
公共项查询(字符串连接字符串、ILogger记录器)
{
_记录器=记录器;
_connectionString=!string.IsNullOrWhiteSpace(connectionString)?connectionString:抛出新的ArgumentNullException(nameof(connectionString));
}
模块设置应如下所示:

public class ItemModule: Autofac.Module
{
    public string QueriesConnectionString { get; }

    public ItemModule(string queriesConnectionString)
    {
        QueriesConnectionString = queriesConnectionString;
    }

    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterType<ItemQueries>();  // --> not sure if needed

        builder.Register(c => 
        {
           var factory = c.Resolve<ItemQueries.Factory>();
           return factory.Invoke(QueriesConnectionString);
        })  
        .As<IItemQueries>()
        .InstancePerLifetimeScope();
    }
}
公共类ItemModule:Autofac.Module
{
公共字符串QueriesConnectionString{get;}
公共项模块(字符串queriesConnectionString)
{
QueriesConnectionString=QueriesConnectionString;
}
受保护的覆盖无效负载(ContainerBuilder builder)
{
builder.RegisterType();//-->不确定是否需要
builder.Register(c=>
{
var factory=c.Resolve();
返回factory.Invoke(queryConnectionString);
})  
.As()
.InstancePerLifetimeScope();
}
}

您可以在lambda注册中解决问题。这就是lambda中的上下文参数的作用

builder
  .Register(c =>
    new ItemQueries(QueriesConnectionString, c.Resolve<ILogger<ItemQueries>>()))
  .As<IItemQueries>()
  .InstancePerLifetimeScope();
builder
.寄存器(c=>
新项目查询(QueriesConnectionString,c.Resolve())
.As()
.InstancePerLifetimeScope();

您可以在lambda注册中解决问题。这就是lambda中的上下文参数的作用

builder
  .Register(c =>
    new ItemQueries(QueriesConnectionString, c.Resolve<ILogger<ItemQueries>>()))
  .As<IItemQueries>()
  .InstancePerLifetimeScope();
builder
.寄存器(c=>
新项目查询(QueriesConnectionString,c.Resolve())
.As()
.InstancePerLifetimeScope();

ILogger
内置于core中,core将其内置的依赖项注入用于自己的目的。这都是您的代码吗?因为您可以/应该连接aspnetcore,以使用autofac容器进行注入,而不是自己的。解决单个容器提供程序的问题比解决多个容器提供程序的问题更容易。我可以将此移到一个答案代替链接,但autofac有一个用aspnetcore提供的服务填充autofac容器的示例:您需要使用autofac中的Factorys
ILogger
内置在core中,core使用它的内置依赖项注入实现自己的目的。这是您的全部代码吗?因为您可以/应该连接aspnetcore以使用您的用于注入的autofac容器,而不是它自己的容器。解决单个容器提供程序的问题比解决多个容器提供程序的问题更容易。我可以将此