gpt4 book ai didi

c# - 依赖注入(inject) IDbConnection SqlConnection

转载 作者:行者123 更新时间:2023-11-30 21:34:19 25 4
gpt4 key购买 nike

有时会引发此异常:

System.InvalidOperationException: 'The ConnectionString property has not been initialized.'

我使用内置的依赖注入(inject):

public void ConfigureServices(IServiceCollection services)
{
services.AddTransient<IDbConnection>(db => new SqlConnection(
Configuration.GetConnectionString("AppConnectionString")));

services.AddScoped<IAppConfigurationRepository, AppConfigurationRepository>();
services.AddScoped<IHomeworkingRequestRepository, HomeworkingRequestRepository>();
services.AddScoped<IEmployeeRepository, EmployeeRepository>();
services.AddScoped<IEmployeeService, EmployeeService>();
services.AddScoped<IHomeworkingRequestService, HomeworkingRequestService>();
services.AddMvc();
}

之前,我已经有这个错误了。代码services.AddScoped<IDbConnection>我改为services.AddTransient<IDbConnection>并解决了这个问题。但是现在我又遇到了错误。

编辑

请查找异常发生时的代码:

public class EmployeeRepository : IEmployeeRepository
{
private readonly IDbConnection _connection;

public EmployeeRepository(IDbConnection connection)
{
_connection = connection;
}

public IEnumerable<Employee> GetAllActiveEmployees()
{
string query = @"
SELECT
FirstName
,LastName
,BusinessUnit
FROM Employees";

using (var db = _connection)
{
_connection.Open(); // <-- The exception is thrown here
return db.Query<Employee>(query);
}
}
}

还请找到完整的堆栈跟踪:

at System.Data.SqlClient.SqlConnection.PermissionDemand()
at System.Data.SqlClient.SqlConnectionFactory.PermissionDemand(DbConnection outerConnection)
at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.ProviderBase.DbConnectionClosed.TryOpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
at System.Data.SqlClient.SqlConnection.Open()
at Homeworking.Dal.EmployeeRepository.GetAllActiveEmployees() in C:\Users\florian.nouri\source\repos\Homeworking\Homeworking.Repository\EmployeeRepository.cs:line 42
at Homeworking.Service.EmployeeService.GetAllEmployees() in C:\Users\florian.nouri\source\repos\Homeworking\Homeworking.Service\EmployeeService.cs:line 22
at Homeworking.Service.HomeworkingRequestService.GetAllEmployees() in C:\Users\florian.nouri\source\repos\Homeworking\Homeworking.Service\HomeworkingRequestService.cs:line 23
at Homeworking.Web.Controllers.AppController.Index() in C:\Users\florian.nouri\source\repos\Homeworking\Homeworking.Web\Controllers\AppController.cs:line 22
at lambda_method(Closure , Object , Object[] )
at Microsoft.Extensions.Internal.ObjectMethodExecutor.Execute(Object target, Object[] parameters)
at Microsoft.AspNetCore.Mvc.Internal.ActionMethodExecutor.SyncActionResultExecutor.Execute(IActionResultTypeMapper mapper, ObjectMethodExecutor executor, Object controller, Object[] arguments)
at Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker.InvokeActionMethodAsync()

最佳答案

using (var db = _connection)

这很糟糕。您为同一连接创建了一个新变量,因此在使用 block 完成后,您的连接将被释放。你不应该这样做。如果你使用容器来创建东西,容器应该处理那些它不再需要的实例。

最有可能发生的情况是您的 _connection 变量被处理掉,并且任何从容器获取连接的类(在 Scoped 的情况下)或任何已经拥有此变量并使用它的类第二次因为它是一个实例字段,将使用已经处理好的连接。

关于c# - 依赖注入(inject) IDbConnection SqlConnection,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50366502/

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