2011-08-05 14 views
5

Pracuję nad prototypową aplikacją EF, używając POCO. Głównie jako wprowadzenie do frameworku zastanawiam się nad dobrym sposobem na skonfigurowanie aplikacji w ładnej strukturze. Później zamierzam włączyć do niego WCF.Konfigurowanie struktury aplikacji EF

Co robiłem jest następujący:

1) stworzyłem plik edmx, ale z kodem Generation Własności ustawione na None i generowane moje schematu bazy danych,

2) I stworzył Poços które wszystkie wyglądają tak:

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) I stworzył kontekst

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

Interfejs wygląda następująco:

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

    int Save(); 
} 

4) Na koniec I stworzył repozytorium, wdrożenie interfejsu:

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

} 

Teraz, kiedy się na zabawy z tym, ta konstrukcja dyktuje mi instancję repozytorium każdym razem, gdy chcesz pobrać lub mutować niektóre dane, jak poniżej:

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

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

Jakoś to po prostu czuje się źle i wadliwa, z drugiej strony, po prostu każdy instancji repozytorium w DE kontekst rived też nie jest zbyt dobry, ponieważ potencjalnie tworzy obiekty, których w ogóle nie potrzebuję.

Jakieś wskazówki, jak sprawić, by ten projekt brzmiał? Czy powinienem to zostawić w ten sposób? Jakiekolwiek rzeczy, które ogólnie powinienem dodać lub czego unikać?

+0

Jaki to rodzaj aplikacji. Webservice, WPF-app, coś jeszcze? – alun

+0

W tym stanie jest to po prostu aplikacja konsolowa, ponieważ jest to tylko czysty prototyp. – duress

+1

Powodem, dla którego pytam, jest to, że sposób obsługi kontekstu jest silnie uzależniony od rodzaju aplikacji. Powszechnie jest na przykład mieć jeden kontekst na formularz w aplikacji wpf i jeden kontekst na żądanie http w aplikacji internetowej i jeden kontekst na wywołanie metody w usłudze internetowej. – alun

Odpowiedz

2

Nie rozumiem tej części:

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

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

Czemu tworząc kontekst w zakresie zewnętrznej jeśli zadzwonisz repozytorium konstruktora bez przechodzenia kontekst jako parametr? Korzystanie z wielu kontekstów sprawi, że rzeczy tylko o wiele trudniejsze. Również, jaki jest sens tworzenia interfejsu dla repozytorium i próby ukrycia go, jeśli twój zewnętrzny blok po prostu stworzy instancję klasy?

Czy Twoje podejście jest prawidłowe? Ogólnie tak. Powinieneś użyć single context for logical operation (jednostka pracy) i jeśli twoje repozytorium dostaje kontekst przez konstruktor, musisz utworzyć nowy zestaw repozytoriów dla każdego kontekstu. Zazwyczaj osiąga się to poprzez wstrzyknięcie zależności.

tylko uruchamianiu każdego repozytorium w kontekście uzyskanych nie czują się zbyt dobrze albo ze względu na potencjalnie instancji obiektów I może nie trzeba w ogóle.

Dobrze ten można rozwiązać bardzo łatwo przez leniwej inicjalizacji:

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

Ale nie byłoby umieścić to do samego kontekstu.Prawdopodobnie użyłbym tego w pewnej fabryce dostępu do danych, ponieważ powinna ona znajdować się poza kontekstem i przechodzić przez pojedynczą fabrykę, ponieważ wstrzyknięcie do klas/metod przy użyciu wielu repozytoriów jest prostsze.

Przy okazji. what value otrzymasz od korzystania z repozytorium?

+0

Pomyślałem o tym po przeczytaniu twojego wpisu i mam nadzieję, że możesz skomentować to, co powiem. Przede wszystkim ten projekt inspirowany jest głównie tutorialem, a podczas obiadu tego popołudnia zadaję sobie dokładnie to samo pytanie, które zrobił starter tego tematu. Repozytoria po prostu dodają dodatkową warstwę, którą nazywam AddObject (lub czymkolwiek innym). Mówiąc o tym, myślę, że faktycznie myślę, że nie korzystam z tego w tej chwili ... – duress

1

Jeśli używasz POCO do utworzenia modelu bazy danych, spróbuj najpierw użyć kodu EF? IMHO przy użyciu Code First jest bardziej przejrzysty niż tworzenie modelu EDMX w projektancie.

+0

Tak, ale w tym przypadku mogę wybrać kilka rzeczy o tym, jak również edmx jest skonfigurowany. – duress

+0

Naprawdę postępuj zgodnie z tą radą i użyj kodu Najpierw. Nie masz żadnego powodu, by zadziwić się EDMX-em. A jeśli naprawdę chcesz zobaczyć, jak będzie wyglądał edmx, istnieje opcja generowania go z pierwszych klas kodu. –

0

Użyj Injection Dependency przy użyciu dowolnego kontenera, takiego jak Castle Windsor, AutoFac, itp., Dostarczając na żądanie Kontekst obiektu.

Powiązane problemy