J'obtiens une erreur lorsque j'essaie d'appeler le contrôleur ci-dessous en utilisant Lamar pour résoudre les dépendances au moment de l'exécution.
J'ai essayé .AddControllersAsServices()
et sans et on obtient toujours le même résultat.
Utilisation de
- ASP.NET Core : 3.1
- Lamar
Container.GetInstance<IDataAccess>()
fonctionne dans la fenêtre de surveillance mais ne sera pas résolu au moment de l'exécution.
Container.WhatDoIHave()
montre également que la dépendance existe
Question ?
Que manque-t-il dans la configuration de Lamar pour résoudre les contrôleurs ?
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly IDataAccess _dataAccess;
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(IDataAccess dataAccess, ILogger<WeatherForecastController> logger)
{
_dataAccess = dataAccess;
}
[HttpGet]
public IEnumerable<string> Get()
{
return _dataAccess.GetAll();
}
}
Inicio.cs
public class Startup
{
public Startup(IConfiguration configuration)
{
Configuration = configuration;
}
public IConfiguration Configuration { get; }
public IContainer Container { get; private set; }
public void ConfigureContainer(ServiceRegistry services)
{
Container = new Container(cfg =>
{
cfg.Scan(scanner =>
{
scanner.AssembliesAndExecutablesFromApplicationBaseDirectory(a =>
a.FullName.Contains("Test3.1"));
scanner.WithDefaultConventions();
scanner.SingleImplementationsOfInterface();
});
});
services
.AddControllers(options =>
{
// Disable automatic fallback to JSON
options.ReturnHttpNotAcceptable = true;
// Honor browser's Accept header (e.g. Chrome)
options.RespectBrowserAcceptHeader = true;
})
.AddControllersAsServices();
services.AddMvc()
.AddControllersAsServices();
Container.WhatDidIScan();
Container.WhatDoIHave();
Console.Write("Container Instantiated");
}
// This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
if (env.IsDevelopment())
{
app.UseDeveloperExceptionPage();
}
app.UseHttpsRedirection();
app.UseDefaultFiles();
app.UseStaticFiles();
app.UseRouting();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllers();
});
}
}
Programme.cs
public class Program
{
public static void Main(string[] args)
{
CreateHostBuilder(args).Build().Run();
}
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.UseLamar()
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder
.UseContentRoot(Directory.GetCurrentDirectory())
.UseIISIntegration()
.UseStartup<Startup>();
});
}
Une exception non gérée s'est produite lors du traitement de la demande.
LamarException : Impossible de construire l'instance enregistrée weatherForecastController de 'Test3._1.Controllers.WeatherForecastController' : Impossible de remplir les dépendances de l'un des constructeurs publics. Constructeurs disponibles : new WeatherForecastController(IDataAccess dataAccess,
ILogger<Test3._1.Controllers.WeatherForecastController>
logger) * IDataAccess n'est pas enregistré dans ce conteneur et ne peut pas être découvert automatiquement par une politique familiale manquante.