c# - 无法让 Lamar (IOC) 解决 .NET Core 3.1 中的 API 控制器依赖关系
问题描述
尝试使用 Lamar 调用下面的控制器以在运行时解决依赖关系时出现错误。
我已经尝试过.AddControllersAsServices()
,但仍然得到相同的结果。
使用
- ASP.NET 核心:3.1
- 拉马尔
Container.GetInstance<IDataAccess>()
在监视窗口内工作,但不会在运行时解析
Container.WhatDoIHave()
也表明存在依赖关系
问题?
我在 Lamar 配置中缺少什么来解析控制器?
[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();
}
}
启动.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();
});
}
}
程序.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>();
});
}
处理请求时发生未处理的异常。
LamarException:无法构建'Test3._1.Controllers.WeatherForecastController'的注册实例weatherForecastController:无法填充任何公共构造函数的依赖关系可用构造函数:new WeatherForecastController(IDataAccess dataAccess,
ILogger<Test3._1.Controllers.WeatherForecastController>
logger)* IDataAccess未在此容器中注册,不能任何缺失的家庭政策自动发现
解决方案
错误消息表明容器无法解析控制器的依赖关系。确保这些依赖项已在容器中注册,以便它知道在激活控制器时如何解决它们。
这是因为正在配置单独的容器,Startup
而框架使用的容器并不知道,IDataAccess
因为它Scan
没有应用于其容器。
参考Lamar - 与 ASP.Net Core 集成
public class Startup {
public Startup(IConfiguration configuration) {
Configuration = configuration;
}
public IConfiguration Configuration { get; }
//REMOVED IContainer. It is not needed
public void ConfigureContainer(ServiceRegistry services) {
//Apply scan to the registry used by framework so container is aware of types.
services.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();
services.WhatDidIScan();
services.WhatDoIHave();
Console.Write("Container Instantiated");
}
//...omitted for brevity
}
推荐阅读
- python - 如何使用列的结果作为列引用?Python
- r - 使用管道的正确方法是什么?
- vim - 终端 Vim 删除线
- svn - TortoiseSVN localhost 或 hosts 文件查找比 IP 查找慢 Windows 10
- php - 现在()和MySql中带有数据(日期)的一列之间的区别
- docker - 在 Airflow 上为 Docker 启用 pySpark
- javascript - nth-child 选择器不适用于手机上属于 JavaScript 的 Tingle.js 类
- python - Pandas Split (group) + Apply + Rejoin (concat) 出现无法解释的行为,但仅在排序时
- c# - 我是否需要 Dispose() 从 TcpListener 等返回的对象
- json - CSV 文件中 JSON 的 Spark Scala 数据帧序列