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.
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 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>
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
Igor Kulman (28.06.10 - 15:47:51)
Ďakujem za pripomienky
- Používam len jeden DataContext
- Opravené, nesnažím sa mať pekný kód, to je môj štandard :)
Pridať komentár
Autor
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.

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