代码之家  ›  专栏  ›  技术社区  ›  NSS

在WebApi中如何在被调用的实用程序调用中处理DI

  •  0
  • NSS  · 技术社区  · 5 年前

    环境: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();
    
    0 回复  |  直到 5 年前