繁体   English   中英

如何解决 ASP.NET Core Web API 项目中类库的 Windsor 容器依赖项?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM