2011-09-29 28 views
9

Herkes WCF Web API Önizleme 5 ile çalışan Ninject almak için bana doğru yönde işaret edebilir mi? Bunu, ASP.NET MVC 3 projemde ve ayrıca Ninject.Extensions.Wcf kütüphanesini kullanarak başka bir dahili WCF Hizmeti'nde başarıyla çalıştırıyorum. Ancak yeni bir MVC 3 projesi oluştururken ve WebApi.All kütüphanesini NuGet'ten aldığımda işe yaramayacağım.WCF Web API Önizleme 5 ile çalışma açma

Bu stackoverflow defterine Setting up Ninject with the new WCF Web API baktım ancak son sürümdeki bazı değişikliklerle ilgili olabileceğine inanıyorum.

Ayrıca hangi Ninject Kütüphanelerinin ana bilgisayarın ötesine atıfta bulunacağından da emin değilim. Ninject.MVC3, Ninject.Extensions.Wcf kullanırım.

Bu konuda herhangi bir yardım çok takdir edilecektir.

**** yukarıda belirtilen söz konusu cevap dan kullanıyorum GÜNCELLEME **

Kodu. Bunu kendi sınıf dosyasında var.

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 
     } 
    } 

Benim Global.asax içinde var bu:

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

ben yaşıyorum sorunu IResourceFactory arayüz tanınmadığı konusunda ve HttpConfiguration.Create() artık o kadar ihtiyacım var ki SetResourceFactory ayarlamak için başka bir şekilde HttpConfiguration(). CreateInstance yöntemini kullanarak yapmaya çalıştım ama neşe yok.

P5 yılında
+0

istendiği gibi koduyla bir güncelleme yayınladı var @Alexander kodunuzu –

+0

gönderin. – Cragly

cevap

9

Ninject ve WebAPI ile benim kodudur, çalışıyor.

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>(); 
    } 

} 

WebApiConfiguration

bir sınıf inherites oluşturun ve RegisterRoutes içinde NinjectWebApiConfiguration kullanmak

public static void RegisterRoutes(RouteCollection routes) { 

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

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

    routes.MapServiceRoute<ContactsApi>("api/contacts", config); 
} 
+0

WebApi sürüm sürümünü kullanarak bir 'HttpSelfHostServer 'ile çalışmak için Ninject bağlaması elde etmek için bu yaklaşımı kullandım.'CreateInstance' yöntemi yerine DependencyResolver = yeni NinjectDependencyResolver (çekirdek); – neontapir

4

Eğer WebApiConfiguration kaynaklanıyor ve türetilmiş yapılandırmayı kullanmak zorunda: Aşağıdaki

public class NinjectConfiguration : WebApiConfiguration 
    { 
     public NinjectConfiguration(IKernel kernel) 
     { 
      CreateInstance((t, i, m) => 
      { 
       return kernel.Get(t); 
      }); 
     } 
    } 
+0

Teşekkürler Alexander, ancak SetServiceInstanceProvider VS olarak çözülüyor mu? Bir isim alanını mı kaçırdım? Projemin MVC/WCF ninject uzantılarına ihtiyacı var mı? NinjectConfiguration adlı yeni bir sınıf dosyası oluşturdum ve sağladığınız kodu ekledim. Aynı zamanda Ninject Serivce Modülümde hangi noktada yüklerim. Standart WCF Servislerimden birinde şöyle diyoruz: IKernel çekirdeği = yeni StandardKernel (yeni NinjectServiceModule()); Çok teşekkürler. – Cragly

+0

Üzgünüm, benim hatam. CodePlex'in yanlış bir Web API sürümüne başvurdum. Şimdi CreateInstance olarak adlandırılıyor - yukarıdaki kodu güncelledi. –

3

Orada harika cevaplar burada sorusuna vardır ama sana varsayılan WebAPI yapılandırmayla yolu göstermek istiyoruz:

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; 
    } 

Aşağıdaki blog yazısı, WCF Web API'sinde Ninject entegrasyonu hakkında biraz konuşur:

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

+0

Bu çözüm hoş görünüyor; anahtar HttpConfiguration (veya kullandığınız gibi türetilmiş WebApiConfiguration) CreateInstance delegate özelliğini kullanıyor. Ancak, çözümünüzün bir Ninject çekirdeğini yeni bir araya getireceğini ve her bir istekte bu hizmet türüne bağlanmayı ayarlayacağını düşünüyorum! Belki de Yeni Nesil Ninject'in daha iyi olması ve Application_Start'taki bağlamanın daha iyi olması, referansı özel bir statik alanda saklamak, hizmet türlerini oluşturmak için kullanmak ve Application_End içinde atmak daha iyidir. –

+0

@AndrewWebb öneri için teşekkürler. Açıklamaya çalıştığınız şeyin bir örneğini verebilir misiniz? Mesajıma yorum yazabilirsiniz: http://www.tugberkugurlu.com/archive/introduction-to-wcf-web-api-new-rest-face-ofnet veya burada. – tugberk

+0

Yeni bir yanıtta tam bir örnek eklemeyi denedim, ancak biçimlendirme çöplükti. Herneyse, Global.asax.cs sınıfında şu alanı ekleyin: özel statik IKernel _ninKernel; Application_Start'ta standart bir çekirdek oluşturun ve ref bu alanda saklayın ve bağlantılarınızı ayarlayın. Bu çekirdek nesnesini Application_End içinde atın: - _ninKernel.Dispose(); Http yapılandırmanızı ayarladığınızda yeni hizmet örnekleri için bu alanı kullanın: - CreateInstance = (serviceType, context, request) => _ninKernel.Get (serviceType), –

İlgili konular