Próbuję wymyślić, gdzie powinienem umieścićoperacja bazy danych dla każdej jednostki. Przed tym zamieszaniem dla każdej jednostki wykonywałem wszystkie operacje na bazie danych w klasie dostawcy. Klasa dostawcy oznacza, że każda klasa ma dostawcę. Jak na przykład:
class Member
{
public string FirstName;
public string LastName;
}
class MemberProvider
{
//Singleton
//Do database operations
......
public List<Member> GetItems(FirstName = null, LastName = null)
{
// run store procedure
//this returns List<Member> if any
}
public Member GetItem(int? Id = null,FirstName = null, LastName = null)
{
// run store procedure
//this return Member if any
}
....
}
wtedy gdy potrzebuję listy członków z pewnym filtrowaniem, robię to:
List<Member> members = MemberProvider.Instance.GetItems(FirstName = "John", LastName = "Black");
Pytanie brzmi: jak mogę wykonać wszystkie operacje bazy danych związane z jednostką w samej jednostce? Czy to dobra praktyka? Co powinienem przeczytać, aby zrozumieć tę koncepcję?
Z góry dziękuję.
Odpowiedzi:
5 dla odpowiedzi № 1W większości przypadków obiekty biznesowe i dostęp do danych powinny być oddzielone. Spójrz na wzorzec repozytorium tutaj, i tutaj. Jest to prawdopodobnie dokładnie to, czego potrzebujesz.
4 dla odpowiedzi nr 2
Sugerowałbym użycie wzorca repozytorium. Oto naprawdę dobre posty, aby uzyskać dobre wprowadzenie i przykładowy kod: Używanie wzorców repozytorium i jednostki pracy z Entity Framework 4.0
i kolejny Implementacja repozytorium i jednostki wzorców pracy w aplikacji ASP.NET MVC
3 dla odpowiedzi nr 3
Powinieneś pomyśleć o zastosowaniu zasady „Separacja obaw". Dlatego inna klasa powinna być odpowiedzialna za operacje surowe.
Możesz rozważyć przyjrzenie się wzorowi repozytorium. Patrik Löwendahl napisał łatwy do przeczytania samouczek na początek.
2 dla odpowiedzi № 4
Uważam, że operacje na bazie danych powinny być w osobnej klasie. Spójrz na dyrektora ds. Pojedynczej odpowiedzialności http://www.objectmentor.com/resources/articles/srp.pdf i wzorzec projektu repozytorium http://martinfowler.com/eaaCatalog/repository.html.