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

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

9 голосов
/ 29 сентября 2011

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

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

Я также не уверен, на какие библиотеки 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 метод, но не радость.

Ответы [ 3 ]

9 голосов
/ 11 октября 2011

Ниже приведен мой код с 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);
}
4 голосов
/ 30 сентября 2011

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

public class NinjectConfiguration : WebApiConfiguration
    {
        public NinjectConfiguration(IKernel kernel)
        {
            CreateInstance((t, i, m) =>
            {
                return kernel.Get(t);
            }); 
        }
    }
3 голосов
/ 21 ноября 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 в WCF Web API:

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

...