Ninject работает с WCF Web API Preview 5

Может ли кто-нибудь указать мне правильное направление, чтобы заставить Ninject работать с WCF Web API Preview 5? У меня он успешно запущен и работает в моем проекте ASP.NET MVC 3, а также в другой внутренней службе WCF с использованием библиотеки Ninject.Extensions.Wcf. Однако я не могу заставить его работать при создании нового проекта MVC 3 и получении библиотеки WebApi.All из NuGet.

Я просмотрел этот пост stackoverflow Настройка Ninject с новым WCF Web API, но не могу заставить его работать, что, как я полагаю, может быть связано с некоторыми изменениями в последней версии.

Я также не уверен, на какие библиотеки Ninject ссылаться помимо основной. Использую ли я Ninject.MVC3, Ninject.Extensions.Wcf.

Любая помощь в этом будет высоко оценена.

****ОБНОВИТЬ**

Код, который я использую, взят из ответа на вопрос, упомянутый выше. У меня есть это в своем собственном файле класса.

   public class NinjectResourceFactory : IResourceFactory
    {
        private readonly IKernel _kernel;

        public NinjectResourceFactory(IKernel kernel)
        {
            _kernel = kernel;
        }

        public object GetInstance(Type serviceType, InstanceContext instanceContext, HttpRequestMessage request)
        {
            return _kernel.Get(serviceType);
        }

        public void ReleaseInstance(InstanceContext instanceContext, object service)
        {
            // no op
        }
    }

Это у меня есть в моем global.asax:

var configuration = HttpConfiguration.Create().SetResourceFactory(new NinjectResourceFactory());
RouteTable.Routes.MapServiceRoute<myResource>("resource", configuration);

Проблема, с которой я сталкиваюсь, заключается в том, что интерфейс IResourceFactory не распознан и что HttpConfiguration.Create() больше не существует, поэтому мне нужно установить SetResourceFactory другим способом, который я пытался сделать с помощью метода HttpConfiguration().CreateInstance, но не радость.


person Cragly    schedule 29.09.2011    source источник
comment
@Alexander опубликовал обновление с кодом в соответствии с запросом.   -  person Cragly    schedule 30.09.2011


Ответы (3)


Ниже приведен мой код с Ninject и WebApi, он работает. Создайте класс, наследуемый от WebApiConfiguration

public class NinjectWebApiConfiguration : WebApiConfiguration {
    private IKernel kernel = new StandardKernel();

    public NinjectWebApiConfiguration() {
        AddBindings();
        CreateInstance = (serviceType, context, request) => kernel.Get(serviceType);
    }

    private void AddBindings() {
        kernel.Bind<IProductRepository>().To<MockProductRepository>();
    }

}

и используйте NinjectWebApiConfiguration в RegisterRoutes

public static void RegisterRoutes(RouteCollection routes) {

    routes.IgnoreRoute("{resource}.axd/{*pathInfo}");

    var config = new NinjectWebApiConfiguration() { 
        EnableTestClient = true
    };

    routes.MapServiceRoute<ContactsApi>("api/contacts", config);
}
person zanewill    schedule 11.10.2011
comment
Я использовал этот подход, чтобы заставить привязку Ninject работать с HttpSelfHostServer, используя версию выпуска WebApi. Метод CreateInstance заменен на DependencyResolver = new NinjectDependencyResolver(kernel); - person neontapir; 22.08.2013

В P5 вы должны получить от WebApiConfiguration и использовать вашу производную конфигурацию:

public class NinjectConfiguration : WebApiConfiguration
    {
        public NinjectConfiguration(IKernel kernel)
        {
            CreateInstance((t, i, m) =>
            {
                return kernel.Get(t);
            }); 
        }
    }
person Alexander Zeitler    schedule 30.09.2011
comment
Спасибо, Александр, но откуда берется форма SetServiceInstanceProvider, поскольку VS говорит, что не может ее разрешить? Я пропустил пространство имен? Нужны ли моему проекту расширения ninject MVC/WCF. Я создал новый файл класса с именем NinjectConfiguration и добавил предоставленный вами код. Также в какой момент я буду загружать свой модуль Ninject Serivce. В одной из моих стандартных служб WCF я называю это так: IKernel kernel = new StandardKernel(new NinjectServiceModule()); Большое спасибо. - person Cragly; 30.09.2011
comment
Извините моя ошибка. Я имел в виду неправильную версию веб-API от CodePlex. Теперь он называется CreateInstance — обновлен код выше. - person Alexander Zeitler; 01.10.2011

Здесь есть отличные ответы на вопрос, но я хотел бы показать вам способ с конфигурацией WebApi по умолчанию:

    protected void Application_Start(object sender, EventArgs e) {

        RouteTable.Routes.SetDefaultHttpConfiguration(new Microsoft.ApplicationServer.Http.WebApiConfiguration() { 
            CreateInstance = (serviceType, context, request) => GetKernel().Get(serviceType)
        });

        RouteTable.Routes.MapServiceRoute<People.PeopleApi>("Api/People");
    }

    private IKernel GetKernel() { 

        IKernel kernel = new StandardKernel();

        kernel.Bind<People.Infrastructure.IPeopleRepository>().
            To<People.Models.PeopleRepository>();

        return kernel;
    }

В приведенном ниже сообщении в блоге немного рассказывается об интеграции Ninject с веб-API WCF:

http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet

person tugberk    schedule 21.11.2011
comment
Это решение выглядит красиво; ключ использует свойство делегата CreateInstance HttpConfiguration (или производную WebApiConfiguration, как вы используете). Однако я думаю, что ваше решение обновит ядро ​​Ninject и установит привязку каждого запроса к этому типу службы! Возможно, лучше обновить Ninject и установить привязку в Application_Start, сохранить ссылку в частном статическом поле, использовать ее для создания типов служб и удалить ее в Application_End. - person Andrew Webb; 16.12.2011
comment
@AndrewWebb спасибо за предложение. Можете ли вы предоставить образец того, что вы пытаетесь объяснить? вы можете прокомментировать мой пост: tugberkugurlu .com/archive/ или здесь. - person tugberk; 16.12.2011
comment
Я попытался добавить полный образец в новый ответ, но форматирование было мусором. Так или иначе, в классе Global.asax.cs добавьте это поле: private static IKernel _ninKernel; Обновите стандартное ядро ​​в Application_Start, сохраните ссылку в этом поле и настройте свои привязки. Удалите этот объект ядра в Application_End:- _ninKernel.Dispose (); Используйте это поле для обновления экземпляров службы при настройке конфигурации HTTP: CreateInstance = (serviceType, context, request) => _ninKernel.Get (serviceType), - person Andrew Webb; 19.12.2011
comment
Что сработало для меня, так это просто передать экземпляр класса NinjectWebApiConfiguration в RouteTable.Routes.SetDefaultHttpConfiguration(): RouteTable.Routes.SetDefaultHttpConfiguration(new NinjectWebApiConfiguration()); Нет необходимости в функции GetKernel, которая создавала бы новый объект StandardKernel каждый раз, когда поступает URL-адрес, соответствующий маршруту. - person dfjacobs; 30.12.2011
comment
@dfjacobs Я тоже обычно так делаю, но для простоты я привел самый простой пример. - person tugberk; 30.12.2011