Как использовать DependencyResolver в автономном приложении Net48?

Я получил задание, которое содержит создание приложения .Net 4.8, содержащего «HttpSelfHostServer». Я застрял в поисках назначения "служб IServiceCollection" config.DependencyResolver (типа System.Web.Http.Dependencies.IDependencyResolver)

Мне бы очень хотелось не использовать autofac или другие фреймворки, но все руководства, которые я могу найти, указывают на эти фреймворки. Разве Microsoft не предлагает выход?

1 ответ

Мне просто нужно было решить ту же проблему. Вот как я это сделал:

Сначала я создал новый класс фасада для отображения 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);
    }
}

Это потребовало от меня получения последнего пакета NuGet. Microsoft.Extensions.DependencyInjection.Abstractionsв соответствии с ответом здесь: Как я могу увидеть все услуги, которые может предоставить .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>();

Для пивоварения я просто включаю свой контроллер 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.

Я надеюсь, что это поможет и вам!

Другие вопросы по тегам