2013-03-11 8 views
10

atıldığı için işlem tamamlanamıyor. Bu nedenle, numaralı Öznitelikler ve Filtreler ile basit bir depo deseni kullanıyorum çünkü NuGet'ten Ninject.Web.WebApi-RC paketini kullanıyorum.Ninject WebAPI DbContext

Bu ilk istek için çalışır ama benim DbContext istekte kapsamını beri, bundan sonraki tüm istekleri üzerine yerleştirilmiştir.

this.Kernel.Bind<MyDbContext>().ToSelf().InRequestScope(); 
this.Kernel.Bind<IRepository>().To<Repository>().InRequestScope(); 
this.Kernel.BindHttpFilter<CommunicationKeyValidationFilter>(FilterScope.Action) 
     .WhenActionMethodHas<CommunicationKeyValidationAttribute>() 
     .InRequestScope(); 
: Burada

public class Repository : IRepository 
{ 
    public Repository(MyDbContext dbContext) 
    { 
     this.dbContext = dbContext; 
    } 
} 

benim Ninject bağlamaları şunlardır:

İşte
public class CommunicationKeyValidationFilter : AbstractActionFilter 
{ 
    public CommunicationKeyValidationFilter(IRepository repository) 
    { 
     this.repository = repository; 
    } 
    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     // do stuff 
    } 
} 

benim deposudur: Burada

public class CommunicationKeyValidationAttribute : FilterAttribute 
{ 
} 

benim filtresidir: Burada

benim niteliktir

Benim kontrolör şöyle görünür: Burada

public class HomeController 
{ 
    [CommunicationKeyValidation] 
    public ActionResult Index() 
    { 
     // do stuff 
    } 

konu CommunicationKeyValidationFilter üzerinde yapıcı sadece ilk talep üzerine çağrılan olmasıdır. Filtreyi çözme girişiminde her seferinde bu filtreyi oluşturmak için neden açabileceğim bir yol var mı?

+0

: (? böcek) bu yüzden bu özellik kaynaklanır web.api içinde Ninject bir hata söyleyebilirim . Öyle görünüyor Web.Api kendisi filtreleri önbelleğe: Ben [AutoFac web.api entegrasyonu] bunu buldum (https://code.google.com/p/autofac/wiki/WebApiIntegration): "MVC filtre sağlayıcının aksine Web API'sındaki bir örnek, filtre örneklerinin önbelleğe alınmaması gerektiğini belirtmenize izin vermez.Bu, Web API'sındaki tüm ** filtre özniteliklerinin, uygulamanın tüm ömrü boyunca var olan etkin tekil örneklerdir. ** " – nemesv

+0

Evet, Aynı makaleyi okuduğuma inanıyorum. Herkes her isteği sırasında yeni bir örneğini oluşturur özel bir filtre sağlayıcı falan yazarak bu ele olsaydı merak ettim. –

+0

İlginç bir şekilde Ninject, Web.API ... – nemesv

cevap

15

Filtreler WebAPI tarafından önbelleğe alınır. Geçici kapsamda olmalılar, böylece WebApi yaşam döngüsünü yönetebilir. Çünkü uzun yaşam döngüsünün daha kısa yaşam döngüleri vardır herhangi bağımlılığı olamaz.

Ne olsa yapabileceği filtrenin yürütülmesi sırasında depo yaratmaktır. Bunun için o kullanarak bir fabrika enjekte etmek en iyisidir NinjectFactoryExtension: Sorununu Yeniden oluşturma başardı

public class CommunicationKeyValidationFilter : AbstractActionFilter 
{ 
    public CommunicationKeyValidationFilter(IRepositoryFactory repositoryFactory) 
    { 
     this.repositoryFactory = repositoryFactory; 
    } 

    public override void OnActionExecuting(HttpActionContext actionContext) 
    { 
     var repository = this.repositoryFactory.CreateRepository(); 
    } 
} 

public interface IRepositoryFactory { IRepository CreateRepository(); } 
kernel.Bind<IRepositoryFactory>().ToFactory(); 
+1

Teşekkürler. Bu sadece kurucu enjeksiyonunu kullanmak kadar kolay değil ama benim sorunumu çözüyor. –

+0

@Remo Bu, WebApi'ye özgü filtrelerin önbelleğe alınması mı? Yoksa MVC filtreleri için de fabrikaları kullanmalı mıyız? Tüm çalışmalarınız için teşekkürler. – kenchilada

+0

Hayır, WebAPI'ye özgü değil. Mvc aynı –