Почему контроллеры веб-API Asp.net не являются производными от IController - PullRequest
7 голосов
/ 29 февраля 2012

В ASP.net MVC4 есть эта «новая» концепция веб-API для представления функциональности CRUD в вашей модели данных. Базовый класс для этих контроллеров - DataController, производный от ApiController.

К сожалению, это ApiController не является производным от IController, что проблематично, поскольку эти запросы не могут быть обработаны через обычную фабрику пользовательских контроллеров, поскольку они должны возвращать экземпляр IController.

Кто-нибудь знает причину этого, поскольку я не могу понять, почему у вас в вашем MVC-проекте есть контроллер, который не является производным от IController, так как это нарушает вашу фабрику пользовательских контроллеров, поскольку она не способна создавать все экземпляры контроллер в вашем проекте.

Короче говоря, из-за этого наследования вы не можете использовать свой DI-контейнер для внедрения зависимостей.

Ответы [ 2 ]

7 голосов
/ 04 апреля 2012

Я также отправил этот же вопрос в Microsoft и получил следующий ответ от Эйлона Липтона (спасибо за это):

Коротко говоря, в то время как ASP.NET MVC и ASP.NET WebAPI имеют много общих концепций проектирования (внедрение зависимостей, множество интерфейсов для подключения пользовательских реализаций и простота тестирования), они основаны на различных базовых стеках HTTP.MVC основывается на стеке System.Web, который используется в ASP.NET более 10 лет.Web API основан на новом стеке System.Net.Http, который предлагает большую гибкость для хостинга (IIS + пользовательские хосты + хосты модульного тестирования), а также лучшую тестируемость и расширяемостьЕсли вы сравните IController и IHttpController, вы увидите, что один использует System.Web вверх и вниз по стеку, а другой вообще не использует его.

Независимо от всего этого, все технологии построены настек ASP.NET - MVC, веб-формы, веб-API, веб-страницы (и Razor) - будет продолжать работать бок о бок в приложении, позволяя выбирать правильные части для построения каждой части вашего приложения.Хотя отдельные реализации компонентов в каждом фрагменте не являются взаимозаменяемыми, каждый из них может быть подключен к одним и тем же службам, таким как системы внедрения зависимостей, средства ведения журналов, поставщики данных и т. Д.по этому вопросу я думаю, что следует уточнить вещи дальше.

1 голос
/ 29 февраля 2012

Чтобы выполнить DI с ASP.Net WebAPI, вам необходимо создать средство разрешения зависимостей для вашего контейнера DI.

следующие работы для Ninject

public class NinjectDependencyResolver : System.Web.Http.Services.IDependencyResolver
{
    private static IKernel m_Kernel;

    public NinjectDependencyResolver()
    {
        m_Kernel = new StandardKernel();
    }

    public NinjectDependencyResolver(IKernel myKernel)
    {
        m_Kernel = myKernel;
    }

    public object GetService(Type serviceType)
    {
        return m_Kernel.TryGet(serviceType);
    }

    public IEnumerable<object> GetServices(Type serviceType)
    {
        return m_Kernel.GetAll(serviceType);
    }
}

затем свяжите его в файле Global.ascx, используя:

GlobalConfiguration.Configuration.ServiceResolver.SetResolver(new NinjectDependencyResolver(yourKernel));

это похоже (но не совсем идентично) на внедрение зависимостей MVC3

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...