2011-08-05 15 views
5

POCO'ları kullanarak bir prototip EF uygulaması üzerinde çalışıyorum. Özellikle çerçeveye giriş olarak, uygulamayı güzel bir yapıya kurmanın iyi bir yolu hakkında merak ediyorum. Daha sonra buna WCF'yi dahil etmeyi planlıyorum. Yaptığım NeBir EF uygulamasının yapısını ayarlama

şudur:

1) Bir edmx dosyası oluşturulur, ancak Kod Üretimi Mülkü'yle Yok olarak ayarlayın ve benim veritabanı şemasını oluşturulan,

2) Poços yarattı hangi tüm benziyor: bir Bağlam yarattı

public class Person 
{ 
    public Person() 
    { 
    } 

    public Person(string firstName, string lastName) 
    {   

     FirstName = firstName; 
     LastName = lastName; 
    } 

    public int Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
} 

3)

public class PocoContext : ObjectContext, IPocoContext 
{ 
    private IObjectSet<Person> persons; 

    public PocoContext() : base("name=PocoContainer", "PocoContainer") 
    { 
     ContextOptions.LazyLoadingEnabled = true; 
     persons= CreateObjectSet<Person>(); 
    } 

    public IObjectSet<Person> Persons 
    { 
     get 
     { 
      return persons; 
     } 
    } 

    public int Save() 
    { 
     return base.SaveChanges(); 
    } 
} 

arayüzü aşağıdaki gibidir:

public interface IPocoContext 
{ 
    IObjectSet<Person> Persons { get; } 

    int Save(); 
} 

4) Son olarak ben bir arabirim uygulayan, bir depo yarattı: Artık

public class PersonRepository : IEntityRepository<Person> 
{ 
    private IPocoContext context; 

    public PersonRepository() 
    { 
     context = new PocoContext(); 
    } 

    public PersonRepository(IPocoContext context) 
    { 
     this.context = context; 
    } 

    // other methods from IEntityRepository<T> 
} 

public interface IEntityRepository<T> 
{ 
    void Add(T entity); 
    List<T> GetAll(); 
    T GetById(int id); 
    void Delete(T entity); 

} 

Bununla uğraşırken binerken, bu tasarım örneğini beni dikte bir ben böyle getirme veya bazı verileri mutasyona istediğiniz her seferinde bağlantı havuzunu: her nasılsa bu sadece sadece de her depoyu başlatmasını, diğer taraftan, yanlış ve kusurlu hisseder

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

Yaşanmış içerik de, ihtiyaç duymayacak potansiyel olarak anlık nesneler nedeniyle, çok da iyi hissetmiyor.

Bu tasarımın nasıl yapılacağına dair ipuçları var mı? Bu şekilde bırakmalı mıyım? Bunu yaparken eklemem gereken veya genel olarak kaçmam gereken şeyler?

+0

Ne tür bir uygulama bu? Web servis, WPF-app, başka bir şey? – alun

+0

Bu durumda sadece bir konsol uygulamasıdır, çünkü sadece en az bir prototiptir. – duress

+1

Sormamın nedeni, bağlamınızı nasıl ele aldığınızın, uygulama türünden büyük ölçüde etkilendiğidir. Örneğin bir wpf uygulamasında form başına bir bağlam ve bir web uygulamasında her bir http isteği için bir bağlam ve bir web hizmetinde yöntem başına bir bağlam olması yaygındır. – alun

cevap

2

? Birden çok bağlam kullanmak, işleri daha da zorlaştıracaktır. Ayrıca, dış arabiriminiz yalnızca sınıfın örneğini oluşturacaksa, depo için arabirimi oluşturma ve onu saklamaya çalışmanın amacı nedir?

Yaklaşımınız doğru mu? Genel olarak evet. single context for logical operation'u (iş birimi) kullanmalı ve deponuzun yapıcı aracılığıyla bağlam alması durumunda, her bir içerik için yeni bir depo kümesi oluşturmanız gerekir. Bu genellikle bağımlılık enjeksiyonu ile elde edilir.

sırf ben hiç gerek olmayabilir potansiyel başlatmasını nesnelerin, Ya çok iyi hissetmez türetilmiş bağlamda her depoyu başlatmasını.

private SomeRepositoryType _someRepository 
public SomeRepositoryType SomeRepository 
{ 
    get { _someRepository ?? (_someRepository = new SomeRepositoryType(context)) } 
} 

Ama kendi bağlamı içine koymak olmaz:

Eh bu tembel başlatma tarafından oldukça kolay çözülebilir.Bunu, bazı veri erişimi fabrikalarında kullanacağım çünkü içeriğin dışında kalmalı ve çoklu depoları kullanarak sınıflara/yöntemlere enjeksiyon olarak tek bir fabrikayı geçmek daha basittir.

B

Btw. what value, depodan nasıl yararlanacaksınız?

+0

Bu yazıyı okuduktan sonra ve ne söyleyeceğim hakkında yorum yapabileceğinizi umuyordum. Her şeyden önce, bu proje bir öğretici tarafından esinlenilmiştir ve öğleden sonra öğle yemeğinde kendime aynı konuyu baştan sona sormuştum. Depolar sadece AddObject (ya da her neyse) diye adlandırdığım fazladan bir katman ekliyor. Bu, düşünmeye geldiğinde, aslında şu andan itibaren bundan faydalanmam gerektiğini düşünüyorum ... – duress

1

Veritabanınızın modelini oluşturmak için POCO'yu kullanırsanız, EF Kod İlkesini deneyin? Kod İlkini kullanan IMHO, tasarımcıda EDMX modeli oluşturmadan daha nettir. Eğer parametre olarak bağlam geçmeden depo yapıcısı ararsanız

using (var context = new PocoContext()) 
{ 
    PersonRepository prep = new PersonRepository(); 

    List<Person> pers = prep.GetAll(); 
} 

Neden dış kapsamında bağlam yaratıyor: Bu bölümü anlamıyorum

+0

Evet öyle, ama bu durumda edmx'in nasıl ayarlandığı hakkında bir şeyler seçebilirim. – duress

+0

Gerçekten bu tavsiyeyi izleyin ve İlk Kod'u kullanın. İlk etapta EDMX ile uğraşmak için bir nedeniniz yok. Ve eğer edmx'in neye benzeyeceğini gerçekten görmek istiyorsan, onu kod ilk sınıftan üretmek için bir seçenek var. –

0

İsteğe bağlı Nesne İçeriği sağlayarak Castle Windsor, AutoFac vb. Gibi herhangi bir kap kullanarak Dependency Injection kullanın.