Как использовать 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.
Я надеюсь, что это поможет и вам!