ASP.NET a použitie Repository Pattern
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>