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

17

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

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

задан user1489941 29.06.2012 в 01:28
источник
  • Простой инжектор 2.5 содержит пакет интеграции Web API. –  Steven 10.03.2014 в 15:21

2 ответа

24
  

Поддерживает ли простой инжектор 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 , очень важно явно зарегистрировать все контроллеры Web 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); 
    
ответ дан Steven 29.06.2012 в 11:42
источник
  • Спасибо за ваш ответ. –  user1489941 02.07.2012 в 18:49
  • Еще один вопрос, который у меня есть: Можно ли избежать отражения с помощью простого инжектора? –  user1489941 02.07.2012 в 18:51
  • Коррекция кода в ключе: «GetAllInstance» исправлено до «GetAllInstances». К сожалению, SO требует 6+ символов для редактирования, но кто-то должен сказать им, что для кода компьютеры неумолимы, такие опечатки должны быть пойманы и отредактированы-исправлены. –  Nicholas Petersen 25.07.2012 в 20:50
3

Короткий ответ: да, это работает. Ниже приведен фрагмент кода, который работает для моего проекта с помощью как 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>()
    
ответ дан Yuriy Silvestrov 13.05.2013 в 20:41
источник