ASP.NET vNext

ورژن جدید Asp.Net با تغییرات فراوان از راه رسید.شاید مهمترین تغییر در این مجموعه،سورس باز شدن به صورت کامل باشد.پیشتر درباره این که مایکروسافت تغییر رویه داده و به سمت شفاف تر شدن گام بر می دارد توضیح دادم.نکته جالب تر این است که مایکروسافت سورس ASP.NET vNext را روی گیت هاب هاست کرده.

تغییرات به وجود آمده در ASP.NET vNext

  • بهینه سازی های کلود روی  MVC, Web API, Web Pages, SignalR, و Entity Framework.
  • یکی شدن MVC, Web API, و Web Pages تحت عنوان Mvc 6.این باعث از بین رفتن خیلی از هم پوشانی هایی می شود که در Web api و Mvc.net وجود داشت.و از یک سری abstraction برای  routing, action selection, filters, model binding استفاده می کند.

public class ValuesController : Controller
{
    // GET /values
    public string Get()
    {
        return "Values";
    }

    // GET /values/1
    public string Get(int id)
    {
        return "Value " + id.ToString();
    }

    // POST /values
    public ActionResult Post()
    {
        return new HttpStatusCodeResult(201);
    }
}    

خبری از ApiController نیست و با Controller ترکیب شده اند.

  • هیچ وابستگی به System.Web وجود ندارد و باعث بهبود کارایی می شود.
  • از هاست مجزا است و می تواند روی IIS,Self Host و یا Windows Service هاست شود.
  • از Dependency injection i به صورت تو کار پشتیانی می شود.یعنی می توان به وسیله  IoC container وابستگی ها را تزریق کرد.
  • vNextاز Rosyln استفاده می کند و شما قادر خواهید بود بدون اینکه نیاز به rebuild باشد کد را تغییر دهید و مرورگر را رفرش کنید.کد شما کار خواهد کرد 😀
  • سورس باز و cross platform است.شما قادر خواهید بود آن را روی لینوکس و مکینتاش اجرا کنید.البته که با Mono.
  • Mono
  • ساختار پروژه ای نیز تغییر کرده و با packages.config ترکیب شده است.در واقع ما به جای csprojs با یک فایل  project.json طرف هستیم که تمام وابستگی ها در آن ثبت شده است.در واقع با class libraries و package ها به یک صورت رفتار می شود.

 project.json

 

ساختار پروژه ساده:

.\HomeController.cs
.\project.json
.\Startup.cs
.\Views\Home\Index.cshtml

مایکروسافت گامی جدی تر برای بهتر شدن برداشته است.البته که این تغییرات نیاز به تلاش برای یادگیری و بکارگیری آن ها دارد ولی در مجموع کارهای ارزشمندی در راه هستند.

منابع:

Introducing ASP.NET vNext

Getting Started with ASP.NET vNext

 

Integration Test به کمک SQL Server Compact

اگر بخواهید برای برنامه خود unit test بنویسید شما درگیر مباحثی از قبیل mock کردن می شوید.ولی زمانی نیاز دارید تا یک عملیات را به طور واقعی تست کنید،مثلا ثبت یک کاربر در دیتابیس،دیگر unit test جوابگو کار شما نیست و نیاز دارید که واقعا این اطلاعات را در یک دیتابیس ذخیره کنید و آن را از دیتابیس دوباره بخوانید و مطمئن شوید کد شما به درستی کار می کند.

از طرفی دیگر زمانی که شما در حال تست برروی entity framework هستید mock کردن dbcontext و استفاده از linq to object الزاما نتیجه برابری با linq to entity نخواهد داشت:

تست درون حافظه‌ی LINQ to Objects با تست واقعی LINQ to Entities که روی یک بانک اطلاعاتی واقعی اجرا می‌شود، الزاما نتایج یکسانی نخواهد داشت (به دلیل انواع قیود بانک اطلاعاتی، پشتیبانی از SQL خاص تولید شده تا بارگذاری اشیاء مرتبط و غیره) و نتایج مثبت آن به معنای درست کار کردن برنامه در دنیای واقعی نخواهد بود. در اینجا Integration tests بهتر جواب می‌دهند و نه Unit tests.

برای تست در این حالت می توان از SQL Server Compact استفاده کرد.زمانی که از این دیتابیس استفاده می کنیم یک فایل با پسوند .sdf می سازد.

برای استفاده از این دینابیس نیاز است پکیج های زیر را از نوگت دانلود کنید:

EntityFramework
EntityFramework.SqlServerCompact
Microsoft.SqlServer.Compact

سپس به صورت زیر عمل کنید:


    public class TestHelper
    {
        public static void SetupTest()
        {
            const string filePath =
           @"D:\SourceCode\test\Source\Service.Integration.Test\TestDb.sdf";  

            if (File.Exists(filePath))
                File.Delete(filePath);

            using (var context = new ApplicationDbContext())
            {
                context.Database.Create();
            }

        }
    }

درکد بالا ما یک کلاس کمکی برای ایجاد دیتابیس  ساخته ایم  که در آن وجود دیتابیس را چک می کنیم و اگر فایل دیتابیس وجود داشت آن را پاک می کنیم سپس یک دیتابیس جدید از ابتدا می سازیم. نحوه استفاده از آن هم به شکل زیر است.


     private ApplicationDbContext _context;

        [TestInitialize]
        public void SetupTest()
        {
            TestHelper.SetupTest();
            _context = new ApplicationDbContext();
        }

در SetupTest یک DbContext ساخته ایم و چون در connection string موجود در app.config آن را صورت زیر تعریف کرده ایم:


    <add name="ApplicationDbContext" connectionString="Data Source=D:\SourceCode\Test\Source\Service.Integration.Test\TestDb.sdf"
                              providerName="System.Data.SqlServerCe.4.0" />

بنابراین در این حالت DbContext ما با TestDb کار خواهد کرد و به راحتی می توانیم عملیات ذخیره شدن یک کاربر را تست کنیم.

 [TestMethod]
     public void Register()
        {
            var str = Guid.NewGuid().ToString().Replace("-", "");

            var userService = new UserService();
            userService.Register(new User
             { UserName = str, Password = str, PhoneNumber = str });
            User firstOrDefault =
              _context.Users.FirstOrDefault(x => x.UserName == str);
            Assert.IsNotNull(firstOrDefault);
        }

Command query separation

این کلمه توسط Bertrand Meyer در کتاب Object Oriented Software Construction ابداع شد.اصل این ایده به این معنی است که متدهای یک شی،در دو دسته بندی تقسیم شوند:

  • Queries:متد هایی هستند که یک خروجی را بر می گردانند و به این معنی است که هیچ stateی را در سیستم تغییر نمی دهند.
  • Commands:متدهایی هستند که state یک سیستم را تغییر می دهند و هیچ خروجی بر نمی گردانند.

این خیلی خوب است که بتوانیم این ساختار را رعایت کنیم.برای مثال زمانی می خواهیم یک صفحه از بلاگ را از دیتابیس بخوانیم و یک شماره به تعداد نمایش آن اضافه کنیم بهتر است که این کار را در دوتابع انجام دهیم.یک تابع اطلاعات را می خواند و یکی دیگر یکی به تعداد نمایش آن اضافه می کند.

در استفاده از یک اصل نمی توان همه چیز را مطلق دید به این معنا که امکان دارد جایی نتوان از آن پیروی کرد مثل pop از یک stack.

Command query separationدر شکل بالا به صورت واضح نشان داده شده است،در جایی که نیاز است یک سفارش را کنسل کرد متد ما در دسته command ها قرار می گیرد و در جایی که نیاز است یک سفارش را بازیابی کرد متد ما در دسته query ها قرار می گیرد.

 

نکاتی درباره Static Constructor در دات نت

public class Human
{
  static Human()
  {

  }
}
 

اگر شما از Constructor استفاده کنید که به هر دلیلی نیاز باشد آن را Static کنید باید نکات زیر را رعایت کنید:

Static Constructor نباید پارامتر داشته باشد.

Static Constructor نمی تواند access modifier هم داشته باشد.

دلیلش هم این است که برنامه نویس قابلیت صدا زدن این سازنده را ندارد و CLR است که تنها یک بار زمانی که برای اولین بار نیاز بود به کلاس دسترسی پیدا کند آن را می سازد و در واقع CLR نمی داند که چه پارامتری را باید به آن پاس کند و برایش معنی ندارد.

 

منبع:

nefcanto

 

تکامل یک برنامه نویس

امروز یک مطلب خیلی زیبا درباره تکامل یک برنامه نویس بود دیدم که خیلی حرف برای گفتن داشت و منو به فکر فرو برد.این مطلب با یک سری کد نشان داده بود که در طی ده سال چگونه نگرش یک برنامه نویس تغییر می کند .
سادگی در کد از اصول برنامه نویسی است و باید به آن توجه کرد.یکی از عواملی که باعث می شود که کد سادگی خود را ازدست بدهد استفاده کردن از الگوها در جاهایی که اصلا به آن ها نیاز نیست.ما از الگوهای برنامه نویسی زمانی استفاده می کنیم که قرار است مشکلی را برایمان حل کنند نه زمانی که اصلا مشکلی وجود ندارد و مابه زور می خواهیم یک الگو را به کد بخورانیم.خود من به محض اینکه با الگو یا کد زیبایی روبرو می شدم هر کار که می شد انجام می دادم تا بتوانم از آن الگو در برنامه ام استفاده کنم،درصورتی که به وجود آن اصلا نیازی نبود.

حال به کد های یک برنامه نویس تازه کار دقت کنید.دراین کد قصد بر این است که یک خروجی چاپ شود و همانطور که مشاهده می کنید با کمترین کد ممکن و با خوانایی بالا این کد نوشته شده.first

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

third
در این جا که دیگر پیچیدگی به حد بحران رسیده است. و چندین خط کد بی دلیل به خاطر صورت مسئله ای بسیار ساده نوشته شدهاست.
fifth
و در پایان می بینید دوباره برنامه نویس به ده سال قبل بازگشته و دوباره همان کد ساده را نوشته.first
تصاویر بالا خیلی حرف برای گفتن دارند.واقعا چرا زمانی که می توانیم یک کد را ساده بنویسیم باید این همه پیچیدگی در کداضافه کنیم؟
با دیدن این عکس ها یاد فرآیند یادگیری ورد افتادم در روز های اول که چیز زیادی نمی دانیم یک سند را به سادگی درست می کنیم و هر چه از امکانات آن مطلع می شویم آن را بیشتر و بیشتر بزک می کینم و بعد از مدتی میفهمیم که هدف ما از تایپ یک نامه صرفا نامه بوده نه نقاشی کردن آن.

کار با Collection در MongoDB

همانطور که دز قسمت های قبل گفته شد Collectionها در mongodb در واقع همان جداول در پایگاه داده های رابطه ای هستند.برای ساخت یک collectionدر مانگو از دستور db.createCollection(name, options) استفاده می شود.

name نام collection مورد نظر است.

options در واقع یک سری پارامتر است که برای ساخت یک collection می توان به تابع createCollection پاس کرد.

مقدایری که در  options  می توان پاس کرد در چدول زیر آورده شده اند:

Field Type Description
capped Boolean اگر این گزینه true ست شود به معنی این است که سایز Collection ثابت است و در صورت بیشتر شدن سایز Collection از سایز تعیین شده داده های قبلی overwrites می شوند.در صورتی که این گزینه را true  ست کردید بایدسایز Collection  را نیز مشخص کنید.
autoIndexID Boolean اگر این گزینه true ست شود برای فیلد _id ایندکس به صورت اتوماتیک در نظر گرفته خواهد شد.
size number  مشخص کردن حداکثر سایز برای collectionهای capped.
max number مشخص کردن بیشترین تعداد documents در هر Collection.

برای مثال :

>db.createCollection("mycol", { capped : true, autoIndexID : true, size : 6142800, max : 10000 } )
{ "ok" : 1 }
>

در خط بالا ما بک collection به نام mycol ساختیم و capped آن را true قزار دادیم.همچنین سایز آن را ۶۱۴۲۸۰۰ با حداکثر ۱۰۰۰۰ داکیومنت قرار دادیم.برای دیدن  collection ها از دستور زیر استفاده می کنیم:

>show collections
mycol
mycollection
system.indexes
>

همچنین برای پاک کردن یک collection از drop استفاده می کنیم:

>db.mycol.drop()
true

کار با دیتابیس در MongoDb

در قسمت قبل با مدل سازی در MongoDB آشنا شدید در این پست می خواهم نحوه ساخت دیتابیس در command line مانگو را به شما آموزش دهم.شما برای ساخت دیتابیس در mongo از کلمه use باید استفاده کنید.این دستور در صورتی که دیتابیس موجود باشد روی دیتابیس مورد نظر سوئیج می کند در غیر این صورت یک دیتابیس جدید می سازد.

use DATABASE_NAME

برای مثال اگر شما می خواهید یک دیتابیس به نام mydb بسازید در این صورت باید از دستور زیر استفاده کنید:

>use mydb
switched to db mydb

برای اینکه متوجه شوید هم اکنون روی چه دیتابیسی در حال کار هستید از دستور db استفاده کنید:

>db
mydb

در صورتی که نیاز دارید تا لیست دیتابیس ها بدست آورید از show dbs استفاده کنید:

>show dbs
local     0.78125GB
test      0.23012GB

نکته:در صورتی که یک دیتابیس را ایجاد کردید ولی نام آن را در لیست دیتابیس ها نشان نداد،می بایست یک رکورد در آن ثبت کنید:

>db.movie.insert({"name":"tutorials point"})
>show dbs
local      0.78125GB
mydb       0.23012GB
test       0.23012GB

برای حذف یک دیتابیس شما می بایست از db.dropDatabase() استفاده کنید:

>db.dropDatabase()

اگر شما نام دیتابیس را مشخص نکنید به طور پیش فرض دیتابیس test پاک خواهد شد.

>use mydb
switched to db mydb
>db.dropDatabase()
>{ "dropped" : "mydb", "ok" : 1 }
>

مدل سازی در MongoDB

مدل داده ها در MongoDB بسیار انعطاف پذیر است به این معنی که شما می توانید اسنادی داشته باشید که از لحاظ ساختار کاملا با هم متفاوت هستند.

در طراحی این نوع داده ها توجه به اصول زیر بسیار حیاتی است:

طراحی اسکیما می تواند با توجه به نیاز کاربر تغییر کند.

اشیایی که نیاز دارند در کنار هم باشند در یک داکیومنت قرار دهید در غیر این صورت آن ها را جداگانه ذخیره کنید و مطمئن شوید که به join نیاز ندارید.

تکرار در داده ها بهتر است از زمان پردازش زیاد زیرا در مقایسه با زمان پردازش بسیار ارزان تر است.

join را در زمان افزودن داده ها اعمال کنید در هنگام خواندن.

مثال:

فرض کنید می خواهید یک دیتابیس برای وبلاگ خود طراحی کنید که حالت های زیر را پشتیبانی می کند:

هر پست یک عنوان منحصر به فرد دارد.

هر پست تعدادی تگ دارد.

هر پست اسم ناشر و تعداد لایک ها را دارد.

هر پست تعدادی کامنت با اسم کسی که کامنت گذاشته و همچنین زمان کامنت دارد .

اگر ما در دیتابیس های رابطه ای بخواهیم جداول

نصب MongoDB در ویندوز

اولین قدم در نصب MongoDb اطلاع از ورژن سیستم عامل است که ۳۲ بیتی و ۶۴ بیتی آن مشخص شود.

wmic os get osarchitecture

ورژن های ۳۲ بیتی ویندوز تا سقف ۲ گیگابایت حجم دیتا بیس را پشتیبانی می کنند.قدم بعدی دانلود MongoDb از آدرس http://www.mongodb.org/downloads است.توجه کنید که کدام نسخه را دانلود می کنید.
در قدم بعدی نیاز است تا فایل زیپ دانلود شده را در مسیر دلخواه extract کنید.توجه کنید که نام فایل mongodb-win32-x86_64-[version] یا mongodb-win32-i386-[version] باشد.
سپس تمامی فایل ها را به فولدر Mongodb انتقال می دهیم:

C:\>move mongodb-win64-* mongodb
سپس به وسیله دستور cd وارد فولدر mongodb می شویم.MongoDB نیاز به یک فولدر برای ذخیره کردن فایل های داده دارد که به طور پیش فرض در مسیر c:\data\db قرار دارد.برای ساخت آدرس مورد نظر دستورات زیر را اجرا می کنیم:
C:\>md data
C:\md data\db

اگر شما این مسیر را به هر دلیلی تغییر دهید نیاز به مشخص کردن dbpath در هنگام اجرای MongoDb هستید.
برای مثال اگر برای نصب فولدر D:\set up\mongodb راانتخاب کرده باشید