我得到了一个任务,其中包含创建一个包含“HttpSelfHostServer”的 .Net 4.8 应用程序。我一直在寻求将“IServiceCollection 服务”分配给 config.DependencyResolver(System.Web.Http.Dependencies.IDependencyResolver 类型)
我真的不想使用 autofac 或其他框架,但我能找到的所有指南都指向这些框架。微软不是提供了一种方法吗?
我得到了一个任务,其中包含创建一个包含“HttpSelfHostServer”的 .Net 4.8 应用程序。我一直在寻求将“IServiceCollection 服务”分配给 config.DependencyResolver(System.Web.Http.Dependencies.IDependencyResolver 类型)
我真的不想使用 autofac 或其他框架,但我能找到的所有指南都指向这些框架。微软不是提供了一种方法吗?
我只需要解决同样的问题。我就是这样做的:
首先,我创建了一个新的外观类来映射IServiceCollection
从主机构建器到接口HttpSelfHostConfiguration
支持:
using System;
using System.Collections.Generic;
using System.Web.Http.Dependencies;
using Microsoft.Extensions.DependencyInjection;
namespace IntegrationReceiver.WebApi
{
public class HttpSelfHostDependencyResolver : IDependencyResolver
{
private readonly IServiceProvider sp;
private readonly IServiceScope scope;
public HttpSelfHostDependencyResolver(IServiceProvider sp)
{
this.sp = sp;
this.scope = null;
}
public HttpSelfHostDependencyResolver(IServiceScope scope)
{
this.sp = scope.ServiceProvider;
this.scope = scope;
}
public IDependencyScope BeginScope() => new HttpSelfHostDependencyResolver(sp.CreateScope());
public void Dispose() => scope?.Dispose();
public object GetService(Type serviceType) => sp.GetService(serviceType);
public IEnumerable<object> GetServices(Type serviceType) => sp.GetServices(serviceType);
}
}
Microsoft.Extensions.DependencyInjection.Abstractions
这要求我根据此处的答案获取最新的 NuGet 包:如何查看 .NET IServiceProvider 可以提供的所有服务?
HttpSelfHostServer
然后,我使用以下代码在服务提供商中注册了我的:
services.AddSingleton(sp => new HttpSelfHostDependencyResolver(sp));
services.AddSingleton(sp =>
{
//Starting the HttpSelfHostServer with user-level permissions requires to first run a command like
// netsh http add urlacl url=http://+:8080/ user=[DOMAINNAME]\[USERNAME]
var config = new HttpSelfHostConfiguration("http://localhost:8080");
config.Routes.MapHttpRoute("API Default", "api/{controller}/{id}", new { id = RouteParameter.Optional });
config.DependencyResolver = sp.GetRequiredService<HttpSelfHostDependencyResolver>();
return new HttpSelfHostServer(config);
});
最后,为了找到我的 ApiController,我也必须在服务提供商中注册它。我这样做很简单:
services.AddScoped<HealthCheckController>();
对于 brewity,我只是在下面包含我的 api 控制器来说明它现在如何获取它的依赖项:
using System.Net.Http;
using System.Threading.Tasks;
using System.Web.Http;
namespace IntegrationReceiver.WebApi
{
public class HealthCheckController : ApiController
{
private readonly ServiceBusRunner serviceBusRunner;
public HealthCheckController(ServiceBusRunner serviceBusRunner)
{
this.serviceBusRunner = serviceBusRunner;
}
[HttpGet]
public async Task<HttpResponseMessage> Get()
{
var response = new
{
serviceBusRunner.RunningTasks,
serviceBusRunner.MaxRunningTasks
};
return await Json(response)
.ExecuteAsync(System.Threading.CancellationToken.None);
}
}
}
这是一个非常愚蠢的实现,但对我有用,直到我可以将此代码升级到 net5。
我希望它也能帮助你!