环境:BlazorWASM托管.NETCore5
我需要从WebAPI控制器中使用公共方法调用实用程序类。
什么是正确的方法。
{“无法访问已释放的上下文实例。此错误的一个常见原因是,处理从依赖项注入解析的上下文实例,然后在应用程序的其他位置尝试使用相同的上下文实例。如果对上下文实例调用“Dispose”,或将其包装到using语句中,则可能会发生这种情况。如果您使用的是依赖项注入,则应该让依赖项注入容器负责处理上下文实例。\r\n对象名称:“BasedbContext”。“}
public class OrganizationController : ControllerBase
{
private readonly IConfiguration _configuration;
private BasedbContext _dbContext;
private IHttpContextAccessor _IHttpContextAccessor;
private IHttpClientFactory _HttpClientFactory;
private UtilityClass UtilCls;
private TelemetryClient _telemetryClient;
readonly IMapper _mapper;
private readonly IDistributedCache _distributedCache;
public OrganizationController(IConfiguration configuration, BasedbContext DbContext, IHttpContextAccessor HttpContextAccessor, IHttpClientFactory HttpClientFactory, TelemetryClient tc, IMapper mapper, IDistributedCache distributedCache)
{
_configuration = configuration;
_dbContext = DbContext;
_IHttpContextAccessor = HttpContextAccessor;
_HttpClientFactory = HttpClientFactory;
_telemetryClient = tc;
_mapper = mapper;
_distributedCache = distributedCache;
UtilCls = new UtilityClass(HttpClientFactory, _dbContext, _configuration, _telemetryClient, _distributedCache);
}
somemethod()
{
var tsk3 = UtilCls.SendSMSToTop5Users(OrgLocationTerminal.OrgLocationID_FK.ToString(), LocalDate);
}
}
public class UtilityClass
{
private IHttpClientFactory _HttpClientFactory;
private BasedbContext _dbContext;
private IConfiguration _configuration;
private string ControllerName = "UtilityClass";
private string _SendGridApiKey;
private string _SendGridFromEmail;
private string _SendGridFromEmailName;
private TelemetryClient _telemetryClient;
private readonly IDistributedCache _distributedCache;
public UtilityClass(IHttpClientFactory HttpClientFactory, BasedbContext DbContext, IConfiguration configuration, TelemetryClient tc, IDistributedCache distributedCache)
{
_HttpClientFactory = HttpClientFactory;
_dbContext = DbContext;
_configuration = configuration;
_distributedCache = distributedCache;
_SendGridApiKey = _configuration.GetSection("sendGrid:ApiKey").Value;
_SendGridFromEmail = _configuration.GetSection("sendGrid:FromEmail").Value;
_SendGridFromEmailName = _configuration.GetSection("sendGrid:FromEmailName").Value;
_telemetryClient = tc;
}
sendSMS(string ToCell, string Message)
{
try
{
var result = await _dbContext.XXXXXX.Where(c => c.CellNumber == ToCell).ToList();
}
catch(Exception e)
{
/Error
}
}
}
一切都在WebAPI的startup.cs中注册
例外情况
专用实用程序类实用程序;启动时未注入vis DI
专用只读IConfiguration\u配置;
其余的注册在Web API的startup.cs中
services.AddAutoMapper(typeof(Startup));
services.AddDistributedRedisCache(option =>
{
option.Configuration = _Configuration["RedisCache:ConnectionString"];
option.InstanceName = "X1"; // Your DNS Name
});
services.AddHttpContextAccessor();
services.AddDbContext<BasedbContext>(options =>
{
//options.UseLoggerFactory(MyDBLoggerFactory);
options.UseSqlServer(_Configuration.GetConnectionString("DatabaseConsString"),
sqlServerOptionsAction: sqlOptions =>
{
sqlOptions.EnableRetryOnFailure(maxRetryCount: 10, maxRetryDelay: TimeSpan.FromSeconds(30), errorNumbersToAdd: null);
sqlOptions.UseNetTopologySuite();
});
//options.EnableSensitiveDataLogging();
//options.EnableDetailedErrors();
options.LogTo(Console.WriteLine);
});
services.AddHttpClient("default", client =>
{
//client.BaseAddress = new Uri("");
client.DefaultRequestHeaders.Add("Accept", "");
client.DefaultRequestHeaders.Add("User-Agent", "API");
}).AddHttpMessageHandler<ServerMessageHandler>();
ApplicationInsightsServiceOptions aiOptions = new ApplicationInsightsServiceOptions();
aiOptions.EnableAdaptiveSampling = false;
aiOptions.InstrumentationKey = _Configuration["ApplicationInsights:InstrumentationKey"];
aiOptions.EnableQuickPulseMetricStream = true;
services.AddApplicationInsightsTelemetry();