Igor Kulman

ASP.NET a použitie Repository Pattern

· 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.

public class Customer
{
  /*
   * Database value
  */
  public int Id { get; set; }
  ....
  /*
   * Computed values
   */
  public string BankName { get; set; }
  ...
}

Trieda CustomerRepository

public static class CustomerRepository
{
 private static readonly fakturyDataContext Db = new fakturyDataContext(ConfigurationManager.ConnectionStrings["default"].ConnectionString);
 
 /// <summary>
 /// Počet zákazníkov
 /// </summary>
 /// <returns></returns>
 public static int GetCount()
 {
  return (from c in Db.customers select c).Count();
 }
 
/// <summary>
 /// Získa zákazníka
 /// </summary>
 /// <param name="id">Id zákazníka</param>
 /// <returns></returns>
 public static Customer Get(int id)
 {
   return (from c in Db.customers
   join ll in Db.banks on new { f1 = c.BankId } equals new { f1 = (int?)ll.Id } into tmpLl
   from ll in tmpLl.DefaultIfEmpty()
   where c.Id == id 
   select new Customer
   {
   ...
   }).SingleOrDefault();
 }
 
 /// <summary>
 /// Získa zoznam zákazníkov
 /// </summary>
 /// <param name="sortExpression">Stĺpec na triedenie</param>
 /// <param name="startRowIndex">Od zázhamu</param>
 /// <param name="maximumRows">Počet záznamov</param>
 /// <returns></returns>
 public static IEnumerable<Customer> GetList(string sortExpression, int startRowIndex, int maximumRows)
 {
 ...
 }
 
/// <summary>
 /// Uloženie zákazníka
 /// </summary>
 /// <param name="customer">Zákazník</param>
 public static void Save(Customer customer)
 {
 ...
 }
 
/// <summary>
 /// Zmazanie zákazník
 /// </summary>
 /// <param name="id">ID zákazníka</param>
 public static void Delete(int id)
 {
 ...
 }
 
/// <summary>
 /// Zoznam zákazníkov pre selector
 /// </summary>
 /// <returns></returns>
 public static ListItem[] GetSelectorList(int userId)
 {
 ...
 }
}

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

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

A ten napojiť na obyčajný GridView

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" 
 AllowPaging="True" AllowSorting="True"
 DataSourceID="customersDS" CssClass="d_table" DataKeyNames="Id"
 CellPadding="0" GridLines="None" 
 >
 <Columns>
....
</asp:GridView>