وانیا

آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - بخش اول گام چهارم

1396/03/21

آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - بخش اول گام چهارم

بعد از همه ی مواردی که در مقالات قبل ذکر شد می بایست مهمترین کلاس را ایجاد کنیم. کلاسی برای map کردن کلاس های دیگر می باشد . این نکته را باید عرض کنم واژه ی معادلی برای Map پیدا نکردم . فکر کنم بهترین معادل فارسی تبدیل کردن باشد. از این پس اگر جایی واژه ی تبدیل کردن استفاده شد بدانید منظورمان همان Mapping می باشد. کلاس map برای تبدیل کردن کلاس های و پراپرتی ها به جدول و ستون ( table and columns ) استفاده می شود.

خب برای اینکار کافیست روی سولوشن بخش core رایت کلیک کرده و فولدری تحت عنوان Mappings ایجاد کنیم و در این فولدر تمامی کلاس های مپ شده را نگهداری کنیم. برای شروع نیز مپِ کلاس مربوط به Post را  ایجاد می کنیم. بر روی این فولدر رایت کلیک کرده وکلاس جدیدی تحت عنوان PostMap ایجاد می کنیم و کدهای زیر را در ان می نویسیم :

کدهای کلاس PostMap


using FluentNHibernate.Mapping;
using JustBlog.Core.Objects;

namespace JustBlog.Core.Mappings
{
    public class PostMap : ClassMap<Post>
    {
        public PostMap()
        {
            Id(x => x.Id);

            Map(x => x.Title)
                .Length(500)
                .Not.Nullable();

            Map(x => x.ShortDescription)
                .Length(5000)
                .Not.Nullable();

            Map(x => x.Description)
                .Length(5000)
                .Not.Nullable();

            Map(x => x.Meta)
                .Length(1000)
                .Not.Nullable();

            Map(x => x.UrlSlug)
                .Length(200)
                .Not.Nullable();

            Map(x => x.Published)
                .Not.Nullable();

            Map(x => x.PostedOn)
                .Not.Nullable();

            Map(x => x.Modified);

            References(x => x.Category)
                .Column("Category")
                .Not.Nullable();

            HasManyToMany(x => x.Tags)
                .Table("PostTagMap");
        }
    }
}

 

اگر SQL کار کرده باشید میدانید که کدهای بالا چه مفهومی دارند اما برای دوستانی که عادت به این نوع کدها ندارند باید عرض کنم که نترسید. :دی

  • دو خط اول که فضاهای نامی را وارد کردیم
  • در خط 6 نیز نام کلاس را آوردیم و گفتیم این کلاس از نوع  ClassMap<Post> می باشد.
  • در خط 10 ما ID را از نوع کلید اصلی در نظر گرفتیم 
  • در خط های بعدی نیز برای هر پراپرتی یکسری خصوصیت در نظر گرفتیم. مثلاً برای Title گفتیم حداکثر 500 کارکتر باشد و خالی هم نباشد.
  • در خطوط 40 به بعد نیز دو کلید خارجی را در نظر گرفتیم و نوع ارتباط یا ریلیشن را معرفی کردیم. 
  • در همان خط 40 چون ارتباط یک به چند بود این نوع ارتباط را برقرار کردیم 
  • در خط 44 نیز چون ارتباط چند به چند بود ، کامل مشخص کردیم با کدام جدول ارتباط دارد
  • ClassMap که توضیحش را در بالا دادیم یک کلاس جنریک برای تمامی زیرساخت های Fluent NHibernate's می باشد. یعنی برای ایجاد مپ ما باید از Fluent NHibernate ارث بری کنیم.
  • متد References  نیز برای نشان دادن یک رابطه ی many-to-one اشاره دارد

نکته : به صورت پیشفرض نام پراپرتی به عنوان نام جدول و ستون شناخته می شود. اگر بخواهید این مورد را تغییر دهید و نام دیگری جایگزین کنید کافیست از کد زیر استفاده نمایید : 

Table("tbl_posts");

یعنی در اینجا 

Map(x => x.Title).Column("post_title")

اینگونه خواهد شد. حالا به سراغ مپ دو کلاس دیگر می رویم.
 

Extension Method
جت آشنایی و کاربردهای بیشتر اکستنشن متد ها پیشنهاد می کنیم حتماً ریفرنس زیر را مشاهده نمایید
https://github.com/jagregory/fluent-nhibernate/wiki/Fluent-mapping

 


اینگونه خواهد شد. حالا به سراغ مپ دو کلاس دیگر می رویم.

کدهای کلاس CategoryMap


using FluentNHibernate.Mapping;
using JustBlog.Core.Objects;

namespace JustBlog.Core.Mappings
{
    public class CategoryMap : ClassMap<Category>
    {
        public CategoryMap()
        {
            Id(x => x.Id);

            Map(x => x.Name)
                .Length(50)
                .Not.Nullable();

            Map(x => x.UrlSlug)
                .Length(50)
                .Not.Nullable();

            Map(x => x.Description)
                .Length(200);

            HasMany(x => x.Posts)
                .Inverse()
                .Cascade.All()
                .KeyColumn("Category");
        }
    }
}

کدهای کلاس TagMap


using FluentNHibernate.Mapping;
using JustBlog.Core.Objects;

namespace JustBlog.Core.Mappings
{
    public class TagMap : ClassMap<Tag>
    {
        public TagMap()
        {
            Id(x => x.Id);

            Map(x => x.Name)
                .Length(50)
                .Not.Nullable();

            Map(x => x.UrlSlug)
                .Length(50)
                .Not.Nullable();

            Map(x => x.Description)
                .Length(200);

            HasManyToMany(x => x.Posts)
                .Cascade.All().Inverse()
                .Table("PostTagMap");
        }
    }
}


تا اینجا ما مپ ها را نیز ایجاد کردیم. حال وقتش رسیده تا از الگوی مخزن ( Repository pattern ) بهره ببریم. ما در اینجا از Repository pattern جهت دسترسی به دیتابیس استفاده خواهم کرد. برای دسترسی به کدهای دیتابیس نیاز به کنترلر داریم . هسته ی اصلی ریپازیتاری یا مخزن داده شامل تمامی تعاریف از دیتابیس و دسترسی به داده ها می باشد. همچنین شامل تمام دستورها و روش هایی برای دسترسی به دیتابیس و داده را نیز شامل می شود. Repository pattern اساسا یک میانجی بین دو لایه است. عمدتا جایی استفاده می شود که نیاز است داده ها قبل از رفتن به مرحله بعد تغییر کنند. برای آشنایی بیشتر به عکس زیر نگاه بیاندازید.

 

 

 

 

 

Repository Pattern

 

 

Repository pattern
در عمل Repository یک واسطه است بین Domain و لایه ای که سبب آن المانهای دیتابیس مانند جداول به وسیله آن در محیط کدنویسی شناخته شده اند و مانند یک مجموعه از Domain Object ها عمل میکند.

 

بریم سراغ ایجاد ریپازیتاری برای پروژه. برای ایجاد یک ظاهر یا interface در جایی که دو متد تعریف شده اند عمل می کنیم. یعنی در بخش Core اقدام به ایجاد IBlogRepository می نماییم.
برای این کار برروی Core رایت کلیک کرده و کلاس جدیدی با همین نام ایجاد می کنیم و کدهای زیر را در ان قرار می دهیم.

کدهای کلاس IBlogRepository


using JustBlog.Core.Objects;
using System.Collections.Generic;

namespace JustBlog.Core
{
    public interface IBlogRepository
    {
        IList<Post> Posts(int pageNo, int pageSize);
        int TotalPosts();
    }
}
 

  • متد post در اینجا برای برگرداندن پست های منتشر شده استفاده می شود که در صفحه بندی ها ملاحظه خواهیم کرد. 
  • متد totalpost نیز تعداد پست ها را نمایش خواهد داد
  • در آینده این کلاس و متدها را تکمیل تر خواهیم کرد

حال نیاز به اینترفیسی برای این کلاس داریم . کلاسی ایجاد و نام ان را BlogRepository می نامیم. از این کلاس برای انجام امور مربوط به اینترفیس بهرهمند خواهیم شد! 

کدهای کلاس BlogRepository


using JustBlog.Core.Objects;
using NHibernate;
using NHibernate.Criterion;
using NHibernate.Linq;
using NHibernate.Transform;
using System.Collections.Generic;
using System.Linq;

namespace JustBlog.Core
{
    public class BlogRepository : IBlogRepository
    {
        // NHibernate object
        private readonly ISession _session;

        public BlogRepository(ISession session)
        {
            _session = session;
        }

        public IList<Post> Posts(int pageNo, int pageSize)
        {
            var posts = _session.Query<Post>()
                                  .Where(p => p.Published)
                                  .OrderByDescending(p => p.PostedOn)
                                  .Skip(pageNo * pageSize)
                                  .Take(pageSize)
                                  .Fetch(p => p.Category)
                                  .ToList();

            var postIds = posts.Select(p => p.Id).ToList();

            return _session.Query<Post>()
                  .Where(p => postIds.Contains(p.Id))
                  .OrderByDescending(p => p.PostedOn)
                  .FetchMany(p => p.Tags)
                  .ToList();
        }

        public int TotalPosts()
        {
            return _session.Query<Post>().Where(p => p.Published).Count();
        }
    }
}

 

  • در خط 14 از آبجکتی تحت عنوان ISession استفاده کردیم. این آبجکت برای تماس با پایگاه داده از طریق ساخته و استفاده می شود. هنگامیکه ما مجموعه ای از پست ها را فراخوانی می کنیم در اصل داریم از آبجکت ISession استفاده می کنیم
  •  دو متد Fetch و FetchMany به NHibernate اعلام می کند تا داده ها را جمع آوری کند. 
  • در متد Post ما اقدام به جمع اوری کوئری های دیتابیس می نماییم 
  • این نکته را یاداوری کنیم که ما همزمان از متد FetchMany در کنار دو متد Skip و Take در Linq نمی توانیم استفاده کنیم. پس ما اول تمام پست ها را بر اساس ID انها گرداوری یا Fetch می کنیم سپس اقدام به مرتب سازی یا نمایش بر اساس تگ یا مجموعه یا ... می نماییم.
  • جهت اطلاعات بیشتر برای این موضوع می توانید این لینک را مطالعه نمایید.

NHibernate ISession
ISession مدیریت تداوم اینترفیس را بر عهده دارد و برای ذخیره سازی و بازیابی اطلاعتی که از سمت پایگاه داده ارسال می شوند کاربرد دارد
 

 

/پایان بخش اول گام سوم : آموزش برنامه نویسی وب سایت خبری توسط MVC.Net  - ایجاد کلاسهای دسترسی داده و متد ها ( data access classes and methods ) /

دسترسی به دیگر بخش هاِ آموزش برنامه نویسی وب سایت 

مقدمه 

آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - بخش اول گام اول

آموزش برنامه نویسی وب سایت خبری توسط MVC.Net- بخش اول گام دوم

آموزش برنامه نویسی وب سایت خبری توسط MVC.Net - بخش اول گام سوم

 

تیتر سئو: ایجاد کلاسهای دسترسی داده و متد ها ( data access classes and methods )
کلمات کلیدی سئو: برنامه نویسی - وب سایت خبری - دات نت - mvc - ef - .net - c# - آموزش برنامه نویسی - آموزش کدنویسی - آموزش دات نت
توضیحات سئو: کلاس map برای تبدیل کردن کلاس های و پراپرتی ها به جدول و ستون ( table and columns ) استفاده می شود. کلاسی برای map کردن کلاس های دیگر می باشد
  • اشتراک در شبکه های اجتماعی:
تعداد بازدید : 367     مجموعه : برنامه نویسی

نظرات:

درباره مقاله ی حاضر نظر خود را بنویسید:

نظرات:

/
 علی    
  1396/03/22 - 19:55  
مرسی از آموزش هاتون واقعاً عالیه. میشه کدها رو زیپ شده بذارید و یا توی آموزش ها از ادیتور بهتری برای نمایش کدها استفاده کنید
/
 کیوان مصلحی    
  1396/03/23 - 02:03  
سلام تشکر از آموزش های خوبتون. این درس توی چند جلسه هست؟ کی تموم میشه؟
/
 یاسمن موحدی    
  1396/03/25 - 10:41  
مرسی از مقاله های خوبتون. پس کی آموزش قسمت بعدی منتشر میشه. دو روزه گذشته :/

دیگر مقالات مجموعه برنامه نویسی