Поддерживает ли простой инжектор MVC 4 ASP.NET Web API?

Я новичок в контейнере IOC Simple Injector. Я начну работать в проекте, который потребует многопользовательскую реализацию ASP.NET MVC с использованием веб-API MVC 4 ASP.NET.

Мой вопрос: поддерживает ли простой инжектор MVC 4 ASP.NET Web API? Чтение простой документации инжектора, такой как this > , делает ссылки на MVC 3, и я хотел бы знать, поддерживается ли также MVC 4.

Ответ 1

Поддерживает ли простой инжектор IOC MVC 4 ASP.NET Web API?

В настоящее время он не поддерживает веб-API MVC4, но поддержка будет добавлена ​​в будущем. Руководство по интеграции будет обновлено, когда это произойдет.


UPDATE: Поддержка веб-API добавлена ​​в Simple Injector 2.5.


Тем временем вы можете создать свою собственную реализацию System.Web.Http.Dependencies.IDependencyResolver для простого инжектора. Ниже приведена реализация для работы с веб-API в среде размещения IIS:

public class SimpleInjectorHttpDependencyResolver : 
    System.Web.Http.Dependencies.IDependencyResolver
{
    private readonly Container container;

    public SimpleInjectorHttpDependencyResolver(
        Container container)
    {
        this.container = container;
    }

    public System.Web.Http.Dependencies.IDependencyScope
        BeginScope()
    {
        return this;
    }

    public object GetService(Type serviceType)
    {
        IServiceProvider provider = this.container;
        return provider.GetService(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        IServiceProvider provider = this.container;
        Type collectionType = typeof(IEnumerable<>).MakeGenericType(serviceType);
        var services =(IEnumerable<object>)this.ServiceProvider.GetService(collectionType);
        return services ?? Enumerable.Empty<object>();
    }

    public void Dispose()
    {
    }
}

В этой реализации не используется область охвата, так как вам нужно использовать Per Web Api Request для реализации области видимости внутри веб-хостинга (где запрос может закончиться в другом потоке, чем там, где он был запущен).

Из-за того, как разработан Web API, очень важно явно зарегистрировать все контроллеры веб-API. Вы можете сделать это, используя следующий код:

var services = GlobalConfiguration.Configuration.Services;
var controllerTypes = services.GetHttpControllerTypeResolver()
    .GetControllerTypes(services.GetAssembliesResolver());

foreach (var controllerType in controllerTypes)
{
    container.Register(controllerType);
}

Вы можете зарегистрировать SimpleInjectorHttpDependencyResolver следующим образом:

// NOTE: Do this as last step, after registering the controllers.
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorHttpDependencyResolver(container); 

Ответ 2

Короткий ответ: да, это работает. Ниже приведен фрагмент кода, который работает для моего проекта с помощью как API Web API, так и MVC4 (частично на основе ответа Стивена выше):

var container = new Container();

//Register you types in container here

container.RegisterMvcControllers(Assembly.GetExecutingAssembly());
container.RegisterMvcAttributeFilterProvider();

var controllerTypes =
from type in Assembly.GetExecutingAssembly().GetExportedTypes()
where typeof(ApiController).IsAssignableFrom(type)
where !type.IsAbstract
where !type.IsGenericTypeDefinition
where type.Name.EndsWith("Controller", StringComparison.Ordinal)
select type;

foreach (var controllerType in controllerTypes)
{
    container.Register(controllerType);
}

container.Verify();
DependencyResolver.SetResolver(new SimpleInjectorDependencyResolver(container));

Чтобы получить доступ к вашим типам в контроллерах API, вы можете использовать следующий фрагмент кода:

DependencyResolver.Current.GetService<InterfaceName>()