![](/img/trans.png)
[英]Windsor resolve issue - ASP.NET Core Web API .Net version 6 cannot register my .Net framework 4.8 C# Library assembly
[英]How to resolve Windsor container dependencies for a class library in ASP.NET Core Web API project?
我有一个 ASP.NET Core Web API,它的Program.cs
如下所示,
using Castle.Windsor;
var builder = WebApplication.CreateBuilder(args);
// Add services to the container.
builder.Services.AddControllers();
// Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle
builder.Services.AddEndpointsApiExplorer();
builder.Services.AddSwaggerGen();
var app = builder.Build();
var container = new WindsorContainer();
container.Install(new MyInstaller());
var adapter = container.Resolve<IMyApiAdapter>();
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
app.UseHttpsRedirection();
app.UseAuthorization();
app.MapControllers();
app.Run();
我在 ASP.NET Core Web API 中引用我的类库项目,类库中的我的安装程序类看起来像这样,
public class MyInstaller : IWindsorInstaller
{
public void Install(IWindsorContainer container, IConfigurationStore store)
{
container.Register(Component.For<IDbConnectionFactory>()
.ImplementedBy<SqlDbConnectionFactory>()
.DependsOn(Dependency.OnValue("connectionString", container.Resolve<IBaseDAL>().ConnectionString))
.LifestyleSingleton());
container.Register(Component.For<IClientResponseAdapter>()
.ImplementedBy<ClientResponseAdapter>().LifestyleTransient());
container.Register(Component.For<IMyApiAdapter>()
.ImplementedBy<MyApiAdapter>()
.DependsOn(Dependency.OnValue("container", container))
.LifestyleTransient());
}
}
一旦我运行我的 Web API,我得到以下错误,
如何解决此错误?
一旦解决,我需要在 Controller 中使用MyApiAdapter
类方法。 我应该如何在 Controller 类中引用我的依赖项?
控制器类
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private IMyApiAdapter _adapter;
[HttpGet(Name = "GetWeatherForecast")]
public string GetAsync()
{
HelperResponse hr = new HelperResponse();
hr = _adapter.SetFormActiveFlag(100, true, "","");
return hr.ResponseXml;
}
}
您遇到的错误是由于在注册IDbConnectionFactory
时容器中没有注册IBaseDAL
实现。 您应该在连接工厂之前注册IBaseDAL
实现。
container.Register(Component.For<IBaseDAL>().ImplementedBy<YourDALImpl>());
如果您的IBaseDAL
直到稍后才注册(其他一些 Windsor 安装程序),那么您可以使用DynamicParameters
来提供该依赖关系,并且它将在工厂实例化时解决。
container.Register(Component.For<IDbConnectionFactory>()
.ImplementedBy<SqlDbConnectionFactory>()
.LifestyleSingleton()
.DynamicParameters((k, d) => d["connectionString"] = k.Resolve<IBaseDAL>().ConnectionString));
现在错误已解决,我们可以解决如何将该依赖项添加到您的控制器中。
您要做的第一件事是将IWindsorContainer
集成为 Web API 项目的IServiceProvider
。 这需要在构建WebApplication
之前完成。
//...
builder.Services.AddSwaggerGen();
// Add services via windsor
var container = new WindsorContainer();
builder.Host.UseWindsorContainerServiceProvider(container);
container.Install(new MyInstaller());
var app = builder.Build();
//...
UseWindsorContainerServiceProvider
是 NuGet 包Castle.Windsor.Extensions.DependencyInjection
提供的扩展方法。
由于IWindsorContainer
现在是我们的服务提供者,任何注册到它的东西都可以通过“构造函数注入”或“方法注入”注入到控制器中。
构造函数注入使用构造函数来获取依赖项。 您的天气控制器将如下所示:
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private readonly IMyApiAdapter _adapter;
public WeatherForecastController(IMyApiAdapter adapter)
{
_adapter = adapter;
}
[HttpGet(Name = "GetWeatherForecast")]
public string GetAsync()
{
HelperResponse hr = new HelperResponse();
hr = _adapter.SetFormActiveFlag(100, true, "", "");
return hr.ResponseXml;
}
}
您还可以使用FromServices
属性请求对控制器操作方法的依赖:
[HttpGet(Name = "GetWeatherForecast")]
public string GetAsync([FromServices] IMyApiAdapter adapter)
{
HelperResponse hr = new HelperResponse();
hr = adapter.SetFormActiveFlag(100, true, "", "");
return hr.ResponseXml;
}
您可以在此处阅读有关 DI 到 ASP .NET Core 控制器的所有信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.