0

我将旧的 CMS 从 WebForms .Fet 框架升级到 .net 核心。我从实现 httpclientfactory 的前端开始。

在我升级后端之前,我想在 .net 核心和 .net 框架解决方案上使用相同的数据层,但我很困惑如何在我的 WebForms 解决方案中实现它

在可以从 webforms 和 .net 核心访问的 API 帮助程序类中,我实现了以下内容:

private IHttpClientFactory _httpClientFactory;
public WebSite(IHttpClientFactory httpClientFactory)
{
    _httpClientFactory = httpClientFactory;
}

获取数据的功能是:

public async Task<WebSite> GetSingle(int id)
{
   var client = _httpClientFactory.CreateClient();     // and so on ///      
}

在 .net 核心解决方案上,我初始化 HttpClientFactory,如下所示:

private readonly IHttpClientFactory _clientFactory;
private readonly WebSite _webSite;

在 net core 解决方案 og 中初始化 IHttpClientFactory

public IndexModel(IHttpClientFactory clientFactory)
{
   _clientFactory = clientFactory;
   _webSite = new WebSite(_clientFactory);
}

我得到的数据如下:

WebSite currentWebsite = _webSite.GetSingle(1);

我在我的 WebForms 应用程序中完成了以下操作:

已安装

Autofac.Extensions.DependencyInjection
Microsoft.Extensions.DependencyInjection
Microsoft.Extensions.Hosting
Microsoft.Extensions.Http

将以下内容添加到 global.asax

public static IServiceProvider ServiceProvider;

protected void Application_Start(object sender, EventArgs e)
{
    var hostBuilder = new HostBuilder();
    hostBuilder.ConfigureServices(ConfigureServices);
    var host = hostBuilder.Build();
    ServiceProvider = host.Services;
}

void ConfigureServices(IServiceCollection services)
{
    services.AddHttpClient(); //extension method that add IHttpClientFactories
    var providerFactory = new AutofacServiceProviderFactory();
    providerFactory.CreateBuilder(services);
}

问题是,如何将 httpclientfactoryclient 注入到我的 WebForms 应用程序中,以便可以像在 .net 核心解决方案中一样使用 _webSite.GetSingle(1)

4

1 回答 1

0

Unity 解决了这个问题。

在 Global.asax 中注册了一个容器

var container = Microsoft.AspNet.WebFormsDependencyInjection.Unity.UnityAdapter.AddUnity();
container.RegisterType<IHttpClientFactory, CMSHttpClientFactory>();

其中 CMSHttpClientFactory 是 IHttpClientFactory 的一个非常简单的实现

创建了一个基本 System.Web.UI.Page (以及 UserControl 和 MasterPage),我再次获得了 clientfactory

public IHttpClientFactory _httpClientFactory;

public BasePage()
{
   var container = Microsoft.AspNet.WebFormsDependencyInjection.Unity.UnityAdapter.GetContainer();
   _httpClientFactory = container.Resolve<Api.CMSHttpClientFactory>();
}

然后我再次将其传递给我的 Helperclass。现在我可以在 .net core 和 webfors 4.7.2 上使用相同的 API 调用

于 2020-09-28T11:58:13.467 回答