4.8.09

Chuyển nhà

Mình quyết định viết blog nhiều hơn. Tool mình viết blog sử dụng Microsoft OneNote.

Mà Blogger không hỗ trợ Image provider nên mình quyết định chuyển sang WordPress

Blog mới của mình: http://hacodingjournal.wordpress.com/

Mong mọi người ghé qua nhà mới của mình.

Thanks

1.8.09

SSIS

 
 

SSIS là viết tt ca SQL Server Integration Services, mt trong các thành phn chính ca Microsoft SQL Server Enterpise Edition.

 
 

Tin thân ca SSIS là DTS (Data Trasformation Services). SSIS được tung ra trong phiên bn SQL Server 2005.


 
 

Các tính năng chính ca SSIS:

  • ETL (Extract, Transform, Loading) data
  • Kết hp, chun hóa, phân chia và phân tích d liu.
  • Chuyn hóa các kiu d liu khác nhau (Ví d: chuyn t excel sang SQL Server)
  • Thc hin bo trì d liu và các nghip v v database: Backup, rebuild indexes,…
  • Chuyn các đi tượng SQL Server
  • H tr workflow
  • Thc hin Analysis services và các truy vn v Data-Mining
  • Dùng như là mt datasource cho các báo cáo ca Reporting Services
  • Thc hin FTP
  • Có th to các thành phn theo ý ca lp trình viên
  • S dng các ScriptTask đ viết các mã lnh bng C# trong VSTA
  • Gi mail
  • Truy cp Web Services qua cng HTTP
  • X lý các file: xóa, sa, …

  •  
     

    Kiến trúc ca SSIS


     
     

    SSIS có 2 thành phn chính

  1. Data Transformation Run-time engine: Qun lý các control flow và package
  2. DataFlow engine:
    1. Data Sources
    2. Transformations
    3. Destinations.

       
       

    Gii thiu package

     
     

    Khi to ra 1 solution bng BIDS (Business Intelligent Development Studio). Sinh ra 1 pakage (ging như 1 project mc đnh trong Winform application) có đuôi là dtsx (package1.dtsx).

    Mt package s gm:

  • Control Flow: gm các task và container
  • Precedence constrains
  • DataFlow

     
     


 
 

 
 

14.5.09

Mocking - Visug session- Kỹ thuật Mocking

Maarten giới thiệu kỹ thuật Mocking trong TDD.

10.5.09

Giới thiệu StructureMap (phần 1)

StructureMap là một IoC/DI, có thể tải về tại đây.

Mục đích chính của IoC/DI là tạo sự độc lập giữa các thành phần trong lập trình (decouple components from each other).

Ví dụ: bạn có một service là BannerService, và tham số truyền vào khi khởi tạo là BannerRepository, phần constructor như sau:

public BannerService(IRepository<Banner> repository)

{

repository = new BannerRepository();

this.repository = repository;

}

Với cách viết trên, BannerService phụ thuộc vào BannerRepository, điều này gây khó khăn khi refactor code sau này. Chẳng hạn, ta muốn có 2 repository là SqlBannerRepository và InMemoryBannerRepository, như vậy ta phải thay đổi lại tất cả code mà trước đó ta đã khởi tạo BannerRepository.

Để giái quyết khó khăn này, chúng ta thường sử dụng các IoC như StructureMap, Spring.NET, …

Cơ bản về StructureMap dependency injection:

Giả sử chúng ta có 1 interface là IBannerRepository, chúng ta muốn StructureMap trả về đối tượng BannerRepository khi khi có một yêu cầu đối với IbannerRepository

ForRequestedType<IBannerRepository>()

.TheDefaultIsConcreteType<BannerRepository>();

Ta có thể dùng ObjectFactory để lấy về IBannerRepository:

IBannerRepository repository = ObjectFactory.GetInstance<IBannerRepository>();

namespace StructureMapTutorials
{
    class Program
    {
        static void Main(string[] args)
        {
            StructureMapConfiguration
                .ForRequestedType<IBannerRepository>()
                .TheDefaultIsConcreteType<BannerRepository>()
                .CacheBy(InstanceScope.Singleton);
  IBannerRepository bannerRepository = ObjectFactory.GetInstance<IBannerRepository>();
        }
    } 

}

Ví dụ sau mô tả cách StructureMap đẩy (inject) các đối tượng phụ thuộc vào một đối tượng. Giả sử Mỗi Service sẽ có Repository tương ứng như sau:

public class BannerService : IBannerService

{

Private IRepository<Banner> repository;

public BannerService(IRepository<Banner> repository)

{

this.repository = repository;

}

}

Đăng ký trong StructureMap

ForRequestedType<IBannerService>()

.TheDefaultIsConcreteType<BannerService>();

Và khi ta gọi khởi tạo của IBannerService từ ObjectFactory của StructureMap, StructureMap tự động khởi tạo BannerRepository cho đối tượng BannerService

IBannerService svc =
ObjectFactory.GetInstance< IBannerService>();

Hết phần 1 :)

8.5.09

Inflector.NET

Inflector cho phép bạn trả về số nhiều hoặc số ít của một danh từ:

Inflector.Pluralize("address");

Sẽ trả về addresses

Inflector.Pluralize("species");

Sẽ trả về species

Inflector.Singularize("developers");

Sẽ trả về developer

Các hàm của thư viện:
Camelize
Capitalize
Dasherize
Humanize
Ordinalize
Pascalize
Pluralize
Singularize
Titleize
Uncapitalize
Underscore


Thư viện này có thể tải về tại đây

12.2.09

Sự khác nhau giữa <%= %> và <%# %>

Khi sang làm việc với ASP.NET MVC, chúng ta phải làm việc nhiều hơn với thẻ <%= %> và <%# %> trong ASP.NET. Và thường thì khó phân biệt được sự khác nhau giữa các thẻ đó. Sau đây là đoạn code

Trang default.aspx

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="Difference._Default" %>

DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" >

<head runat="server">

<title>title>

head>

<body>

<form id="form1" runat="server">

<div>

<p>Dấu = : <%= this.TestValue %>p>

<p>Dấu # : <%# this.TestValue %>p>

<p>Thuộc tính trong dấu = : <asp:Label runat="server" ID="_equals" Text="<%= this.TestValue %>" />p>

<p>Thuộc tính trong dấu # : <asp:Label runat="server" ID="_pound" Text="<%# this.TestValue %>" />p>

div>

form>

body>

html>

Và đây là CodeBehind

using System;

using System.Collections.Generic;

using System.Linq;

using System.Web;

using System.Web.UI;

using System.Web.UI.WebControls;

namespace Difference

{

public partial class _Default : System.Web.UI.Page

{

protected void Page_Load(object sender, EventArgs e)

{

_testValue = "2";

}

protected void Page_PreRenderComplete(object sender, EventArgs e)

{

//DataBind();

_testValue = "3";

}

public string TestValue

{

get { return _testValue; }

}

private string _testValue = "1";

}

}


Kết quả khi chạy như sau:

- Nếu chưa comment đoạn code DataBind(); trong PreRenderComplete

Dấu = : 3

Dấu # :

Thuộc tính trong dấu = : <%= this.TestValue %>

Thuộc tính trong dấu # :


- Nếu bỏ comment đoạn DataBind();


Dấu = : 3

Dấu # : 2

Thuộc tính trong dấu = : <%= this.TestValue %>

Thuộc tính trong dấu # : 2



Kết quả trên là do:

  1. <%= expressions %> được thực hiện tại thời gian render trang web
  2. <%# expressions %> được thực hiện khi ta gọi phương thức DataBing(), và thẻ này sẽ không được thực hiện nếu ta không gọi phương thức DataBind()
  3. <%# expressions %> có thể được sử dụng trong thuộc tính của các server controls, còn <%= %> không thể làm thuộc tính cho các server controls.