ASP.NET a použitie Repository Pattern

Kategória: .NET, C#, publikované: 06.02.2010, autor: Igor Kulman

Pri programovaní sa vždy snažím jednoduchý a ľahko pochopiteľný kód a upravovateľný kód, ak je to možné, použijem nejaký návrhový vzor. V ASP.NET som si zvykol na Repository Pattern, v tomto článku vám ukážem, ako na to.

Základná myšlienka Repository Pattern je jednoduchá. Máme triedu Customer reprezentujúcu zákazníka. Údaje o zákazníkovi sú uložené v SQL databáze. O všetky operácie týkajúce sa databázy, teda načítanie zákazníka, uloženie, zmazanie a pod. sa stará trieda CustomerRepository. Logika práce so zákazníkom je teda uložená na jednom jedinom mieste. Žiadne vytváranie zákazníka v mieste registrácie, zmeny hesla a pod., na všetko sa používa CustomerRepsoitory.

Uvediem konkrétny príklad. Začneme s triedou zákazníka.

  1. public class Customer
  2. {
  3. /*
  4.  * Database value
  5. */
  6. public int Id { get; set; }
  7. ....
  8. /*
  9.  * Computed values
  10.  */
  11. public string BankName { get; set; }
  12. ...
  13. }

Trieda CustomerRepository

  1. public static class CustomerRepository
  2. {
  3. private static readonly fakturyDataContext Db = new fakturyDataContext(ConfigurationManager.ConnectionStrings["default"].ConnectionString);
  4.  
  5. /// <summary>
  6. /// Počet zákazníkov
  7. /// </summary>
  8. /// <returns></returns>
  9. public static int GetCount()
  10. {
  11. return (from c in Db.customers select c).Count();
  12. }
  13.  
  14. /// <summary>
  15. /// Získa zákazníka
  16. /// </summary>
  17. /// <param name="id">Id zákazníka</param>
  18. /// <returns></returns>
  19. public static Customer Get(int id)
  20. {
  21. return (from c in Db.customers
  22. join ll in Db.banks on new { f1 = c.BankId } equals new { f1 = (int?)ll.Id } into tmpLl
  23. from ll in tmpLl.DefaultIfEmpty()
  24. where c.Id == id
  25. select new Customer
  26. {
  27. ...
  28. }).SingleOrDefault();
  29. }
  30.  
  31. /// <summary>
  32. /// Získa zoznam zákazníkov
  33. /// </summary>
  34. /// <param name="sortExpression">Stĺpec na triedenie</param>
  35. /// <param name="startRowIndex">Od zázhamu</param>
  36. /// <param name="maximumRows">Počet záznamov</param>
  37. /// <returns></returns>
  38. public static IEnumerable<Customer> GetList(string sortExpression, int startRowIndex, int maximumRows)
  39. {
  40. ...
  41. }
  42.  
  43. /// <summary>
  44. /// Uloženie zákazníka
  45. /// </summary>
  46. /// <param name="customer">Zákazník</param>
  47. public static void Save(Customer customer)
  48. {
  49. ...
  50. }
  51.  
  52. /// <summary>
  53. /// Zmazanie zákazník
  54. /// </summary>
  55. /// <param name="id">ID zákazníka</param>
  56. public static void Delete(int id)
  57. {
  58. ...
  59. }
  60.  
  61. /// <summary>
  62. /// Zoznam zákazníkov pre selector
  63. /// </summary>
  64. /// <returns></returns>
  65. public static ListItem[] GetSelectorList(int userId)
  66. {
  67. ...
  68. }
  69. }

Všetky metódy v CustomerRepository sú statické, pri práci s triedou tak nie je potrebné vytváranie jej inštancií. Vytvorenú triedu je možné použiť aj v spojení s WebForms, stačí definovať ObjectDataSource

  1. <asp:ObjectDataSource SelectCountMethod="GetCount" EnablePaging="true" SortParameterName="sortExpression" ID="customersDS" runat="server" SelectMethod="GetList" TypeName="Classes.RepositoryFactory" DeleteMethod="Delete" >
  2. </asp:ObjectDataSource>

A ten napojiť na obyčajný GridView

  1. <asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False"
  2. AllowPaging="True" AllowSorting="True"
  3. DataSourceID="customersDS" CssClass="d_table" DataKeyNames="Id"
  4. CellPadding="0" GridLines="None"
  5. >
  6. <Columns>
  7. ....
  8. </asp:GridView>
Sledujte moje články: vybrali.sme.sk Linkuj.cz  

Apple iPad: ďalšie sklamanie od Apple
Fámy o tablete od Apple tu boli už dlho, tablet s názvom iPad bol oficiálne predstavený až včera. Aj keď nie som... čítať ďalej

Radenie IEnumerable v C# a Linq
V článku o použití Repository Pattern v ASP.NET som popisoval metódu public static IEnumerable<Customer>... čítať ďalej

Komentáre

RSS komentárovRSS komentárov

Liero (28.06.10 - 15:07:23)

Mam dve pripomienky:

1. Pouzivanie statickej instancie triedy DataContext sa odporuca iba v specifickych pripadoch. pise sa o tom tu napr: http://blogs.msdn­.com/…context­.aspx

v zasade, aplikaciu obycajne limituju samotne query, nie vytvaranie instancie DataContextu. Potom je tiez moze byt problem, ked mas entity z roznych instancii datacontextov. Ak sa to da, je lepsie pouzivat jednu instanciu DataContextu pre jden UnitOfWork.

2. ked ma trieda iba staticke cleny, tak by mala byt oznacena ako static, ked uz sa snazis mat pekny kod ;)

Igor Kulman (28.06.10 - 15:47:51)

Ďakujem za pripomienky

  1. Používam len jeden DataContext
  2. Opravené, nesnažím sa mať pekný kód, to je môj štandard :)

 

Pridať komentár

(povinné)

(povinný,nezverejňuje sa)


Odoslať komentár

Autor

Igor Kulman Igor Kulman at LinkeIn
Igor Kulman at Facebook
Igor Kulman at Flick
Igor Kulman at Twitter

Autor je študentom informatiky na Univerzite Karlovej v Prahe, pracuje ako Solution Architect Assistant a pôsobil aj ako prispievateľ počítačového magazínu.

Kategórie

Náhodná referencia

Notebook pre každého

Notebook pre každého