Использование Microsoft.Extension.DependencyInjection в Asp.net Web Api2 - PullRequest
0 голосов
/ 15 мая 2018

Я пытаюсь реализовать проект webApi Asp.Net, который зависит от стороннего фреймворка, который делает много вещей с HttpContext.Current, которого нет в Asp.net Core. Вот почему я не смог создать базовое веб-приложение Asp.net для полного фреймворка .net.

Итак, я создал старомодный проект веб-приложения Asp.net с расширением WebApi.

Сейчас я пытаюсь использовать Microsoft.Extension.DependencyInjection Framework с ним.

Я нашел этот пример для Asp.Net Mvc4, но мой проект - WebApi. Такой подход не сработал. Может ли кто-нибудь предоставить мне ссылку или фрагмент кода для продвижения вперед?

Заранее спасибо

P.S .: Предоставляя пример, убедитесь, что он не использует OWIN framework. Потому что, когда я пытался использовать конвейер OWIN, сторонняя библиотека (с закрытым исходным кодом) не работала должным образом.

1 Ответ

0 голосов
/ 06 июня 2018

Я также нашел этот пример некоторое время назад, я заставляю его работать идеально как в проекте Asp.Net Mvc4, так и в проекте WebApi2.

Использование некоторого контейнера IoC (например, Unity, Autofac)для проекта WebApi наиболее важной вещью является реализация интерфейса IDependencyResolver для создания собственного средства разрешения зависимостей.

Ее фрагмент кода для проекта WebApi.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        ...

        // using Microsoft.Extension.DependencyInjection here.
        Startup.Bootstrapper(config);
    }
}

public class Startup
{
    public static void Bootstrapper(HttpConfiguration config)
    {
        var provider = Configuration();
        var resolver = new DefaultDependencyResolver(provider);

        config.DependencyResolver = resolver;
    }

    private static IServiceProvider Configuration()
    {
        var services = new ServiceCollection();

        services.AddControllersAsServices(typeof(Startup).Assembly.GetExportedTypes()
            .Where(t => !t.IsAbstract && !t.IsGenericTypeDefinition)
            .Where(t => typeof(IHttpController).IsAssignableFrom(t)
                        || t.Name.EndsWith("Controller", StringComparison.OrdinalIgnoreCase)));

        var serviceProvider = services.BuildServiceProvider();

        return serviceProvider;
    }
}

public class DefaultDependencyResolver : IDependencyResolver
{
    protected IServiceProvider ServiceProvider { get; set; }

    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 IDependencyScope BeginScope()
    {
        return new DefaultDependencyResolver(this.ServiceProvider.CreateScope().ServiceProvider);
    }

    public void Dispose()
    {
        // you can implement this interface just when you use .net core 2.0
        // this.ServiceProvider.Dispose();
    }
}

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

        return services;
    }
}
...