问题描述
我将旧的CMS从WebForms .Fet Framework升级到.net核心。我先从实现了httpclientfactory的前端开始。
在我升级后端之前,我想在.net核心和.net框架解决方案上使用相同的数据层,但是我很难在WebForms解决方案中实现它
在我的API帮助器类中(可从Web窗体和.net核心访问),我实现了以下内容:
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;
在网络核心解决方案中,初始化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
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)
解决方法
团结解决了这个问题。
在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调用