0

i have communication problem while retrieving data from the database

ContractDataService

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ContractShortening.Core.Entities;
using ContractShortening.Core.Interfaces;
using ContractShortening.Infrastructure.Data;
using Microsoft.EntityFrameworkCore;

namespace ContractShortening.Infrastructure.Services;

public class ContractDataService : IContractDataService
{
  private readonly DataDbContext _context;

  //Task<IQueryable<ContractData>> ExecAsync(string ContractNumberPar);
  public async Task<IQueryable<ContractData>> ExecAsync(string contractNumberPar)
  {
    return _context.ContractData
        .FromSqlRaw("[egeria].[ContractData_P] " + contractNumberPar);
  }
}


DataDbContext

using Ardalis.EFCore.Extensions;
using ContractShortening.Core;
using ContractShortening.SharedKernel;
using MediatR;
using Microsoft.EntityFrameworkCore;
using ContractShortening.Core.Entities;

namespace ContractShortening.Infrastructure.Data
{
  public class DataDbContext : DbContext
  {


    public DataDbContext(DbContextOptions<DataDbContext> options) 
      : base(options)
    {

    }

    public DbSet<ContractData> ContractData { get; }


  }
}


IContractDataService

using System.Threading.Tasks;
using ContractShortening.Core.Entities;

namespace ContractShortening.Core.Interfaces
{
    public interface IContractDataService
    {
    Task<IQueryable<ContractData>> ExecAsync(string ContractNumberPar);
    }
}

DataApiController

using DevExtreme.AspNet.Data;
using DevExtreme.AspNet.Mvc;
using Microsoft.AspNetCore.Mvc;
using ContractShortening.Core.Interfaces;

namespace ContractShortening.Web.Api
{
    [Route("api/[controller]/[action]")]
    public class DataApiController : Controller
    {
        private readonly IContractDataService _data;

        public DataApiController(
        IContractDataService data
          )
        {
            _data = data;
         }




        [HttpGet]
        public async Task<IActionResult> GetQuery(DataSourceLoadOptions loadOptions, string contractNumberPar)
        {

          var processes = (await _data.ExecAsync("35/0698/19")).Select(i => new
          {
            i.ContractNumber
            ,i.TypeOfLeasing
            ,i.CodeClient
            ,i.Short
            ,i.NameOfClient
            ,i.Amortization
            ,i.Currency
            ,i.ContractValue
            ,i.NumberOfInstallments
            ,i.FinalValue
            ,i.FinalValuePercent
            ,i.TypeOfBaseRate
            ,i.ValueOfBaseRate
            ,i.REFI
            ,i.InstallmentNumber
            ,i.Type
            ,i.MaturityDate
            ,i.NetAmount
            ,i.CapitalRemaining
          });

          return Json(DataSourceLoader.Load(processes, loadOptions));
        }

 
        
        
    }
}

Program.cs

using Ardalis.ListStartupServices;
using Autofac;
using Autofac.Extensions.DependencyInjection;
using ContractShortening.Core;
using ContractShortening.Infrastructure;
using ContractShortening.Core.Interfaces;
using ContractShortening.Infrastructure.Data;
using ContractShortening.Infrastructure.Services;
using ContractShortening.Web;
using Microsoft.OpenApi.Models;
using Microsoft.Extensions.Configuration;
using Microsoft.EntityFrameworkCore;

var builder = WebApplication.CreateBuilder(args);

builder.Host.UseServiceProviderFactory(new AutofacServiceProviderFactory());

builder.Services.Configure<CookiePolicyOptions>(options =>
{
    options.CheckConsentNeeded = context => true;
    options.MinimumSameSitePolicy = SameSiteMode.None;
});

builder.Services.AddScoped<IActiveDirectoryService, ActiveDirectoryService>();


string defaultConnection = builder.Configuration.GetConnectionString("DefaultConnection");
string seriLogDB = builder.Configuration.GetConnectionString("SeriLogDB");
string ADConnection = builder.Configuration.GetConnectionString("ADConnection");

builder.Services.AddDbContext(defaultConnection);
//builder.Services.AddDbContext(seriLogDB);
//builder.Services.AddDbContext(ADConnection);
builder.Services.AddDbContext<ActiveDirectoryDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString(ADConnection)));
builder.Services.AddDbContext<DataDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString(defaultConnection)));
//builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlServer(builder.Configuration.GetConnectionString(defaultConnection)));

builder.Services.AddControllersWithViews().AddNewtonsoftJson();
builder.Services.AddRazorPages();


#region snippet_MigrationsAssembly


builder.Services.AddDbContext<AppDbContext>(options =>
        options.UseSqlServer(
            builder.Configuration.GetConnectionString(defaultConnection),
            x => x.MigrationsAssembly("ContractShortening.Migration")));


#endregion


builder.Services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "My API", Version = "v1" });
    c.EnableAnnotations();
});

// add list services for diagnostic purposes - see https://github.com/ardalis/AspNetCoreStartupServices
builder.Services.Configure<ServiceConfig>(config =>
{
    config.Services = new List<ServiceDescriptor>(builder.Services);

    // optional - default path to view services is /listallservices - recommended to choose your own path
    config.Path = "/listservices";
});


//builder.Host.ConfigureContainer<ContainerBuilder>(containerBuilder =>
//{
//  //containerBuilder.RegisterModule(new DefaultCoreModule());
//  //containerBuilder.RegisterModule(new DefaultInfrastructureModule(builder.Environment.EnvironmentName == "Development"));
//});


builder.Logging.ClearProviders();
builder.Logging.AddConsole();
//builder.Logging.AddAzureWebAppDiagnostics(); add this if deploying to Azure

var app = builder.Build();

if (app.Environment.IsDevelopment())
{
    app.UseDeveloperExceptionPage();
    app.UseShowAllServicesMiddleware();
}
else
{
    app.UseExceptionHandler("/Home/Error");
    app.UseHsts();
}
app.UseRouting();

app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseCookiePolicy();

// Enable middleware to serve generated Swagger as a JSON endpoint.
app.UseSwagger();

// Enable middleware to serve swagger-ui (HTML, JS, CSS, etc.), specifying the Swagger JSON endpoint.
app.UseSwaggerUI(c => c.SwaggerEndpoint("/swagger/v1/swagger.json", "My API V1"));

app.UseEndpoints(endpoints =>
{
    endpoints.MapDefaultControllerRoute();
    endpoints.MapRazorPages();
});

// Seed Database
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;

    try
    {
        var context = services.GetRequiredService<AppDbContext>();
                           //context.Database.Migrate();
        context.Database.EnsureCreated();
        SeedData.Initialize(services);
    }
    catch (Exception ex)
    {
        var logger = services.GetRequiredService<ILogger<Program>>();
        logger.LogError(ex, "An error occurred seeding the DB.");
    }
}

app.Run();



error

An unhandled exception occurred while processing the request. InvalidOperationException: Unable to resolve service for type
'ContractShortening.Core.Interfaces.IContractDataService' while attempting to activate
'ContractShortening.Web.Api.DataApiController'. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider
sp, Type type, Type requiredBy, bool isDefaultParameterRequired)

Stack Query Cookies Headers Routing InvalidOperationException: Unable to resolve service for type > 'ContractShortening.Core.Interfaces.IContractDataService' while attempting to activate > 'ContractShortening.Web.Api.DataApiController'. Microsoft.Extensions.DependencyInjection.ActivatorUtilities.GetService(IServiceProvider > sp, Type type, Type requiredBy, bool isDefaultParameterRequired) lambda_method620(Closure , IServiceProvider , object[] ) Microsoft.AspNetCore.Mvc.Controllers.ControllerActivatorProvider+<>c__DisplayClass7_0. > b__0(ControllerContext controllerContext) Microsoft.AspNetCore.Mvc.Controllers.ControllerFactoryProvider+<>c__DisplayClass6_0. > g__CreateController|0(ControllerContext controllerContext) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.Next(ref State next, ref > Scope scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeInnerFilterAsync() Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker. > g__Awaited|25_0(ResourceInvoker invoker, Task lastTask, State > next, Scope scope, object state, bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Rethrow(ResourceExecutedContextSeale > d context) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.Next(ref State next, ref Scope > scope, ref object state, ref bool isCompleted) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker.InvokeFilterPipelineAsync() Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker. > g__Logged|17_1(ResourceInvoker invoker) Microsoft.AspNetCore.Mvc.Infrastructure.ResourceInvoker. > g__Logged|17_1(ResourceInvoker invoker) Microsoft.AspNetCore.Routing.EndpointMiddleware.g__AwaitRequestTask|6_0(Endpoint > endpoint, Task requestTask, ILogger logger) Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext) Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, > ISwaggerProvider swaggerProvider) Ardalis.ListStartupServices.ShowAllServicesMiddleware.Invoke(HttpContext httpContext) Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext > context)

Show raw exception details

2
  • No idea, but as a side issue: you have a serious SQL injection problem (and possibly syntax error) at FromSqlRaw("[egeria].[ContractData_P] " + contractNumberPar); you should use proper parameterization like this FromSqlRaw("exec [egeria].[ContractData_P] {0}", contractNumberPar); Commented Apr 3, 2022 at 22:36
  • You have forgotten to register your service IContractDataService in DI. Commented Apr 3, 2022 at 23:36

1 Answer 1

1

Add

builder.Services.AddScoped<IContractDataService, ContractDataService>()
// Or depending on your service behavior [..].AddTransient(..) or [..].AddSingleton(..)

... to your Program.cs

Documentation about DI can be found here

Sign up to request clarification or add additional context in comments.

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.