‫کتاب LINQ in Action

یکی از عادت‌های من در این وبلاگ نوشتن درباره‌ی کتاب‌هایی است که خوانده‌ام. یکی از کتاب‌هایی که مدت‌ها پیش خواندن آن را شروع کردم کتاب LINQ in Action است. این کتاب را برای تکمیل اطلاعاتم راجع به LINQ شروع کردم چون حس می‌کردم چیزهایی که راجع به LINQ از کتاب Pro C# 2008 and the .NET 3.5 Platform یاد گرفته بودم کافی نیست.

با توجه به این که هدف من از یادگیری LINQ صرفاً استفاده از LINQ-to-NHibernate بود، در نتیجه فقط ۵ فصل اول کتاب که راجع به مقدمات LINQ و Linq-to-Objects را مطالعه و بقیه فصول (۸ فصل) که راجع به LINQ-to-XML و LINQ-to-SQL بودند را بی‌خیال شدم. البته این کتاب کمی قدیمی است و در سال ۲۰۰۸ منتشر شده یعنی زمانی که LINQ-to-EF وجود نداشته است.

چیزی که من از خواندن همان ۵ فصل متوجه شدم این بود که یادگیری کامل LINQ بیشتر در کار عملی امکان پذیر است تا مطالعه صرف. از طرفی مطالب مربوط به LINQ به زعم من خیلی فرار هستند و اگر در در عمل و به طور مداوم استفاده نشوند خیلی زود فراموش می‌گردند.

نمی‌دانم از ۲۰۰۸ تا حالا کتاب بهتری برای LINQ منتشر شده یا نه ولی به هر صورت خواندن این کتاب را توصیه می‌کنم به کسانی که می‌خواهد LINQ به طور علمی و کاملاً دقیق بیاموزند.

پ.ن.: در این لینک هم چند کتاب دیگر برای LINQ معرفی شده.

‫‫استفاده از Castle ActiveRecord در چند گام

Castle ActiveRecord یک ابزار کمکی برای استفاده راحت‌تر از NHibernate است. NHibernate خودش هم یک ORM کد باز دات‌نتی معروف است. در واقع می‌توان Castle ActiveRecord را یک ORM خیلی راحت دانست. بسیاری افراد فکر می‌کنند استفاده از ORMها و تنظیمات آنها کار خیلی سختی است. اما من در اینجا می‌خواهم در چند قدم ساده یک پروژه ASP.NET کوچک را با استفاده از Castle ActiveRecord ایجاد کنم.

۱- یک پروژه ASP.NET در ویژوال استودیو ایجاد کنید و اسم آن را ActiveRecordTest بگذارید.
۲- سه صفحه به نام‌های CreateSchema، SampleData و ViewData، یک کلاس به نام Car و یک فایل Global.asax به آن اضافه کنید.
۳- Castle ActiveRecord را از این آدرس دریافت کنید. حجم دریافت ‎1.9 MB است.
۴- یک reference از فایل Castle.ActiveRecord.dll به پروژه اضافه کنید.
۵- کلاس Car را مطابق زیر تغییر دهید. این کلاس رابط برنامه شما و دیتابیس است. این کلاس ساختار جدول دیتابیس را هم تعیین می‌کند. یعنی شما نیازی نیست که به دیتابیس مراجعه کرده و جدولی به اسم Car بسازید. هر فیلد این کلاس که بالای آن [Property] درج شده باشد نمایانگر یک ستون از جدول دیتابیسی است.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using Castle.ActiveRecord;

namespace ActiveRecordTest
{
[ActiveRecord(Lazy = true)]
public class Car : ActiveRecordBase
{
[PrimaryKey]
public virtual long ID { set; get; }

[Property]
public virtual string Manufacture { set; get; }

[Property]
public virtual string Model { set; get; }

[Property]
public virtual int MaxSpeed { set; get; }

[Property]
public virtual string Color { set; get; }
}
}
۶- فایل web.config برنامه را مشابه web.config زیر تغییر دهید. تنظیمات Castle ActiveRecord در اینجا قرار دارند.





















دقت کنید که دیتابیس معرفی شده در connection string باید از قبل ساخته شده باشد ولی نیازی است که جداول آن آماده شده باشد.

۷- با هر بار اجرای برنامه بایستی Castle ActiveRecord مقدار دهی اولیه یا Initialize شود. این کار از طریق متود Application_Start فایل Global.asax انجام می‌شود. متود Application_Start باید مشابه زیر باشد.

protected void Application_Start(object sender, EventArgs e)
{
if (ActiveRecordStarter.IsInitialized)
return;

IConfigurationSource config = ActiveRecordSectionHandler.Instance;
ActiveRecordStarter.Initialize(Assembly.Load("ActiveRecordTest"), config);
}
۸- حالا باید مکانیزمی برای ایجاد دیتابیس بر پایه Domain Entityهای برنامه که در اینجا کلاس Car است ایجاد کنیم. برای این کار باید کد ActiveRecordStarter.CreateSchema()‎ را در Page_Load صفحه CreateSchema قرار دهیم.

۹- برای شروع به کار برنامه نیاز به مقدار داده‌ی تستی داریم. برای این کار کد زیر را در Page_Load صفحه SampleData قرار دهید. نمونه کد زیر نشان می‌دهد چطور می‌توان یک instance از کلاس Car را به عنوان یک رکورد از جدول Car در دیتابیس ذخیره کرد.

Car car1 = new Car()
{
Manufacture = "Toyota",
Model = "Camery",
Color = "White",
MaxSpeed = 200
};

car1.Save();

Car car2 = new Car()
{
Manufacture = "Pride",
Model = "Saba",
Color = "Black",
MaxSpeed = 180
};

car2.Save();
۱۰- بعد از ایجاد داده تستی یک صفحه برای نمایش آنها به کاربر ایجاد می‌کنیم. برای همین به کد markup صفحه ViewData کد زیر را اضافه می‌کنیم.



۱۱- کار کدنویسی تمام شد. حالا شروع به استفاده از برنامه می‌کنیم. برای آن کار جدول کار به طور خودکار ساخته شود یک بار صفحه CreateSchema را در مرورگرتان Browse کنید. پس از این کار اگر به دیتابیس مراجعه کنید خواهید دید جدولی به نام Car با ستون‌ها مورد نظر شما ساخته شده است.

۱۲- حال برای ایجاد تعدادی داده تستی یک بار صفحه SampleData را در مرورگرتان Browse کنید. با این کار ۲ رکورد به جدول Car اضافه می‌شود.

۱۳- حال به صفحه ViewData بروید تا داده‌های ایجاد شده در مرحله قبل از دیتابیس load شده و به شما نمایش داده شود.

۱۴- کار تمام شد. به همین سادگی! سورس این پروژه امتحانی در این آدرس موجود است. برای یادگیری تکمیلی به راهنمای ActiveRecord فراسان یا این آدرس مراجعه کنید.

Many things to learn

I’m always thinking that something may be wrong with my study and learn process. Being a .Net developer in companies in Iran that make enterprise web applications, I’m forced to study and learn so many various things:

1. Web technologies and tools: ASP.NET Webforms, ASP.NET MVC, ASP.NET AJAX, JavaScript, jQuery, CSS and HTML.
2. Application level technologies: C#, NHibernate, LINQ and ADO.NET.
3. Architecture/Design subjects: SOA, various design patterns, MVP, Domain Driven design and UML.
4. Community related subjects: blogging, forum and mailing list activities, contributing in open source projects.
5. Learning English.
6. Miscellaneous technologies: MS SQL Server, MySql, NUnit, Subversion, Git, Visual Studio and Mono.
7. …

So the question is that: Is it correct to learn or study all of this technologies and subjects along with each other? Specially while I think a typical developer in US/Europe have learning/studying program for just a few of them. For example (s)he learn to be expert in data related technologies only just like ADO.NET, NHibernate and Entity Framework.

Being forced to learn and work with all above mentioned technologies and subjects has a very bad disadvantage: you have not enough time to be skilled in a few subset of them. Because when you are learning advanced subjects of a technology A, need to do some work in technology B arises and you need to cut studying technology A and do some studies in technology B in order to solve new problem. Consequently your knowledge of technology A remains facial. And this story goes on and goes on…

Learning from Open Source

In all of my passed years in university and development teams, I was wondering if our style of software development is correct or not. I was comparing ourselves with those development teams in well-known companies and universities in industrial countries specially in United States (I live and work in Iran). There was no direct way to learn from or contact them.

The situation was continued till days that open source spread more widely and internet connections get more accessible in my area of study/work. While I was a Delphi developer and while in first years of C#/ASP.NET, the only open source projects I could find was Linux kernel and other similar projects. These projects was almost written in C and were very large to me to understand and compile.

Fortunately open source projects in C#/ASP.NET has after then increased rapidly and people like me find the chance to get familiar with them. This is exactly the time that I begun to learning software development lessons from famous .Net open source projects like NHibernate, log4net, NUnit, Cuyahoga and so many other ones.

After then I started to download, deploy, use, collaborate in community, build and understand them. By doing each activity I learned a new thing, One of the best learner projects I ever encountered is Cuyahoga. Cuyahoga is an open source CMS that is based on C#/ASP.NET MVC and NHibernate. It works fine with Mono and MySql too. By Cuyahoga I got introduced with Git, a decentralized SCM. Cuyahoga project itself uses some other nice open source .Net projects either internally like NHibernate or for its website and community. For example it uses YetAnotherForum.NET as its forum software, ScrewTurn Wiki for wiki, NAnt, NUnit and finally NHibernate.

Joy of complete reading

Many times we need to learn new technologies. There is two major ways for reading a new technology’s book. Firstly reading miscellaneous articles and papers about that technology and second way is reading a complete book about that thing.

In first approach you find short articles or blog posts about desired subject, read it and then try to find all other parts that you need to learn. In this way there is an opportunity to consume your time in an efficient way by not reading none interesting parts of subject. And there is a threat that says you won’t create a complete picture about the subject in your mind. For example some times you will never realize if ever exists a special feature in a technology or just it is you that don’t know anything about it.

In second approach you consume more time for reading (and practicing) whole book or manual. But instead you will understand anything about it. And you will enjoy of a complete reading. Notice that in this approach you still have the chance to by pass unrelated parts.

Recently I was forced to learn SVN, a well known source code management software. As described before I preferred to use second approach by complete reading svn book. This book covers all needed commands and have been partitioned into some chapters very nicely.