5

Oldukça karmaşık bir problemim var. ASP.NET MVC 5 projemde FluentValidation.MVC kullanıyorum. İçinde, kullanıcının e-posta adresinin çoğaltılmamış olup olmadığını kontrol etmek için bir havuz deseni kullanırım. Sorun gerçekten depo modeli değil;Basit Enjektör “DbContext atıldığı için işlem tamamlanamaz” MVC doğrulaması sırasında

public class SomeRepository 
{ 
    //IEFContext is something I modified the T4 template to generate 
    public SomeRepository(IEFContext context) 
    { 
    _context = context; 
    } 
} 

uygulama bu yaklaşımı kullanır ve o inşaat büyük: Bu depo çalışma zamanında yapıcı enjekte bir varlık Framework bağlam kullandığı bu. SimpleInjector, Per ASP.NET web isteğini (HttpContext.Items'in etrafına sarılır) kullanmak için kapsam verilen EF bağlamımı genişletir.

Dim httpLifecycle = New SimpleInjector.Integration.Web.WebRequestLifestyle(True) 
container.Register(of IEFContext, EFContext)(httpLifecycle) 

Buradaki uygulama ile ilgili herhangi bir sorun yok, yalnızca doğrulama. Sunucu işlem sonrası işlemi aldığında, "Hata, DbContext imha edildiğinden işlem tamamlanamıyor" şeklindedir. Görünüşe göre, herhangi bir EF ile ilgili kodu, her web isteği temelinde bir EF bağlamı kullanan bir FluentValidation özniteliğinde kullanamıyorum. does doğrulama özelliği hakkında özel bir şey,: HttpContext.Items saklanan beri

public class Val : AbstractValidator<Entity> 
{ 
    public Val() 
    { 
     _repos = Container.GetInstance<ISomeRepos>(); 
     RuleFor(i => i.Email).Must((o, v) => 
     { 
      _repos.HasDistinctEmail(o.ID, v); 
     } 
    } 
} 

bağlam önceki istekle ölmeliydim. Ne olduğuna dair bir fikrin var mı? Doğru olarak WebRequestLifecycle'u ayarlayarak biliyorum, EF içeriğinin istekte bulunmasına neden oluyorum. Bunun uygun olacağını düşünürdüm.

cevap

4

Benim iyi bahis Val sınıfının bir örneği olan yapıcı sadece bir kez denir anlamına gelir AppDomain (a tek), süresi boyunca önbelleğe alınır ve bu nedenle sadece o repo neden tek ISomeRepos giderir olmasıdır singleton'a da (ve onunla birlikte tüm bağımlılıklarına) terfi olun.

hızlı bir düzeltme basit, temsilci iç GetInstance çağrıyı taşımak: Bu

public Val() 
{ 
    RuleFor(i => i.Email).Must((o, v) => 
    { 
     repos = Container.GetInstance<ISomeRepos>(); 
     repos.HasDistinctEmail(o.ID, v); 
    } 
} 
+0

olduğunu gösterir! Teşekkürler. –