1

我得到了一个任务,其中包含创建一个包含“HttpSelfHostServer”的 .Net 4.8 应用程序。我一直在寻求将“IServiceCollection 服务”分配给 config.DependencyResolver(System.Web.Http.Dependencies.IDependencyResolver 类型)

我真的不想使用 autofac 或其他框架,但我能找到的所有指南都指向这些框架。微软不是提供了一种方法吗?

4

1 回答 1

0

我只需要解决同样的问题。我就是这样做的:

首先,我创建了一个新的外观类来映射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。

我希望它也能帮助你!

于 2022-01-08T10:14:28.783 回答