Как внедрить зависимость в webapi в .net framework с помощью Microsoft.Extensions.DependencyInjection? - PullRequest
0 голосов
/ 07 октября 2019

Я пытаюсь внедрить мой регистратор в качестве зависимости в проекте веб-API .Net Framework 4.7.2, выполнив следующие инструкции:

https://scottdorman.blog/2016/03/17/integrating-asp-net-core-dependency-injection-in-mvc-4/

Это прекрасно работает для веб-приложения MVCно терпит неудачу в проекте webapi с ошибкой «отсутствует конструктор без параметров».

Как успешно внедрить, используя только сборку по умолчанию: Microsoft.Extensions.DependencyInjection в платформе?

public class Startup
{
    public void Configuration(IAppBuilder app)
    {

        var services = new ServiceCollection();
        ConfigureServices(services);
        var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
        DependencyResolver.SetResolver(resolver);
    }

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
            .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
            .Where(t => typeof(IController).IsAssignableFrom(t)
                        || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));
        services.AddSingleton<IMyInterface , MyClass>();
    }
}
public class DefaultDependencyResolver : IDependencyResolver
{
    protected IServiceProvider serviceProvider;

    public DefaultDependencyResolver(IServiceProvider serviceProvider)
    {
        this.serviceProvider = serviceProvider;
    }

    public object GetService(Type serviceType)
    {
        return this.serviceProvider.GetService(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return this.serviceProvider.GetServices(serviceType);
    }
}

public static class ServiceProviderExtensions
{
    public static IServiceCollection AddControllersAsServices(this IServiceCollection services,
        IEnumerable<Type> controllerTypes)
    {
        foreach (var type in controllerTypes)
        {
            services.AddTransient(type);
        }

        return services;
    }
}

Получение сообщения об ошибке «Конструктор без параметров» свпрыск как это:

private IMyInterface _my;
public HomeController(IMyInterface my)
{
    _my= my;
}

Ответы [ 2 ]

1 голос
/ 08 октября 2019

Объяснение регистрации

Одна проблема заключается в том, что вы регистрируете свой DependencyResolver с помощью API регистрации распознавателя MVC, который, к сожалению, отличается от API регистрации распознавателя WebAPI. Вместо этого вы хотите сделать следующее::

public void Configuration(IAppBuilder app)
{    
    var services = new ServiceCollection();
    ConfigureServices(services);
    var resolver = new DefaultDependencyResolver(services.BuildServiceProvider());
    HttpConfiguration config = new HttpConfiguration();
    config.DependencyResolver = resolver;
    app.UseWebApi(config);
}

Также обратите внимание, что интерфейс IDependencyResolver определяется отдельно в System.Web.Http , поэтому ваш класс DefaultDependencyResolver должен быть обновлен для его получения.

Одна вещь, которая изменилась в этом интерфейсе, это то, что существует BeginScope API. Чтобы реализовать это, вызовите метод расширения CreateScope , представленный на IServiceProvider в Microsoft.Extensions.DependencyInjection, чтобы получить новую область. Затем передайте провайдера из этой области в новый экземпляр вашего DefaultDependencyResolver.

    public IDependencyScope BeginScope()
    {
        return new DefaultDependencyResolver(this.serviceProvider.CreateScope().ServiceProvider);
    }

Полный пример

Пример блога, который вы использовали для MVC, использовал OWIN. Когда я решил сделать полный пример, я столкнулся с той же ошибкой, что и вы, и это произошло потому, что я неправильно настроил OWIN, поэтому никогда не вызывали Startup. Вот полный рабочий пример использования Microsoft.Extensions.DependencyInjection для внедрения в контроллеры MVC и WebAPI:

https://github.com/ryandle/MVC_WebApi_DI_Example

0 голосов
/ 07 октября 2019

Используете ли вы [Serializable] на вашем HomeController? Если это так, при его использовании вам нужен конструктор без параметров.

Попробуйте добавить это: public HomeController() { } и запустите снова.

Дополнительная информация: Ошибка конструктора без параметра

...