2011-03-05 16 views
7

MVC uygulamasını kullanırken Entity Framework bağlamını yönetmenin en iyi yolu nedir?EF İçerik Yönetimi

Bir Repository/Hizmet kalıbı kullanıyorum.

bu sorulardan bazıları inceledik Düzenleme

: stackoverflow.com/users/587920/sam-striano, Ondan önce daha karıştı. Bazıları, depo başına bağlamı kullanır, ancak bir denetleyici yönteminde birden fazla depo kullanmak istersek?

Ve iyi bir ayırma tasarımını takip etmek için, MVC uygulamasında UnitOfWork'u EF'ye bağımlı hale getirerek nasıl kullanırsınız? Sahte bir bağlam kullanarak denetleyicilerimi, modelimi, hizmetleri vb. Test etmek istiyorum.

+0

bunu defalarca tartışıldı. Örneğin, bu kullanıcıdan geçen haftadan itibaren size soruları öneririm: http://stackoverflow.com/users/587920/sam-striano Sonra bulduğunuz somut problemi sorun. –

+0

@Lad - Pleas benim düzenle. – Andrew

+0

Bu, EF Code First Repository Patter için bir İş Birimi ile ilgili kodu gösteren iyi bir gönderidir. Structuremap'ı bir IoC olarak kullanır ve her şey için kod örnekleri vardır. http://stackoverflow.com/questions/4442828/entity-framework-4-ctp-4-ctp-5-generic-repository-pattern-and-unit-testable – Paul

cevap

6

kullanın Bağımlılık Enjektör gibi Kontrol çerçevesinin/İnversiyon:

  1. Ninject
  2. Autofac
  3. StructureMap
  4. Birlik

bir IoC kapsayıcı kullanarak, nasıl söyleyebilir Tek bir veri bağlamını yönetmek (genellikle, istek başına). Veri içeriğini istek başına ayarladığınızda, kapsayıcı, istek başına aynı veri bağlamına bir veri bağlamı gerektiren herhangi bir sınıfı otomatik olarak verir.

İşte Ninject'i kurma hakkında bir good article.

Ninject Modülü:

public class NinjectRegistrationModule : NinjectModule 
{ 
    public override void Load() 
    { 
     Bind<MyDataContext>().ToSelf().InRequestScope(); 
     Bind(typeof(RepositoryImplementation<>)).ToSelf().InRequestScope(); 

    } 
} 

Jenerik Repository:

public RepositoryImplementation<T> : IRepository<T> where T : class 
{ 
    MyDataContext _dataContext; 

    public RepositoryImplementation<T>(MyDataContext dataContext) 
    { 
     _dataContext = dataContext; 
    } 

    // bunch of methods that utilize _dataContext 
} 

kodunuzu büyük olasılıkla genel depo kullandığınız varsayarak benzeyen sonunda ne olacak

Servis Sınıfı:

public class MyServiceClass 
{ 
    IRepository<SomeEntity> _someEntityRepository; 

    public MyServiceClass(IRepository<SomeEntity> someEntityRepository) 
    { 
     _someEntityRepository = someEntityRepository; 
    } 

    // do stuff with _someEntityRepository = someEntityRepository; 
} 

Denetleyici:

public class MyController 
{ 
    MyServiceClass _myServiceClass; 

    public MyController(MyServiceClass myServiceClass) 
    { 
     // Ninject will auto-magically give us a myServiceClass 
     // which will Ninject will inject a repository into MyServiceClass's constructor 
     _myServiceClass = myServiceClass; 
    } 

    public ActionResult MyAction() 
    { 
     // use _myServiceClass to do stuff 
     return View(); 
    } 
} 
+0

DI'yi seviyorum, ancak yine de ObjectContext'i depo içinden başlatmalısınız. Örneğin, IoC konteyneri tarafından bir tekil olarak yapılandırılmış bir Deponun sonuçlarını düşünün ve bir yapıcı argümanı olarak bir ObjectContext'i alır. – smartcaveman

+0

Harika gönderi, teşekkürler! Yine de birkaç sorum var. 1) Ninject Bind örneklerinde, EF4 kullanıyorum, burada bağlamı Bind (). ToSelf(). InRequestScope(); MVC uygulaması EF'den hiçbir şey bilmemeli, doğru mu? – Andrew

+0

Ninject modülünü servis katmanınıza koymayı denediniz mi ve sadece ASP.NET MVC projenizde referans aldınız mı? – Omar

0

Eğer işlevsellikiniz düz ise, her Havuzda yeni bir ObjectContext oluşturmalısınız. Anlatmak için ucuzlar.

Bu durum bir çakışma yaratırsa, yorumda önerildiği gibi bir Çalışma Düzeni modelini kullanabilirsiniz.

Bir ObjectContext veya DataContext'i DI konteyneriyle bütünleştirirken son derece dikkatli olmanızı öneririm. Pek çoğu, yaşam döngüsü için uygun kapsamı varsayılan olarak kullanmaz.

+0

Her deponun yeni bağlamı olması, yalnızca basit senaryolar. Genellikle içeriği birden çok havuz arasında paylaşmak istediğinizi fark ettiniz. Bu genellikle UnitOfWork kalıbı kullanılarak işlenir. –

+0

UnitOfWork kalıbının iyi örnekleri mi? – Andrew

+0

http://martinfowler.com/eaaCatalog/unitOfWork.html – smartcaveman