泥庭

2012年3月2日

DAO Frameworkを作る

Filed under: .NET, DB — タグ: — yone64 @ 11:12 AM

そんなわけで、DAO Frameworkを自作してた気がします。というわけで、その辺を。

DTOは、.NET Frameworkだと属性ベースで指定するのがいい感じです。

[Table(Name = "PERSON")]
class Person
{
    [Column(Name = "ID", IsPrimaryKey = true, IsDbGenerated = true)]
    public int Id { get; set; }

    [Column(Name = "NAME")]
    public string Name { get; set; }

    [Column(Name = "BIRTHDAY")]
    public DateTime Birthday { get; set; }
}

.NET Framework3.5以降の場合、TableAttributeとColumnAttributeはSystem.Data.Linq.Mapping名前空間のものを使うとよいでしょう。
対して、DAOはDTOの型をGeneric引数として指定するのが便利です。

class Dao<T> where T : new()
{
	// テーブル名
    private static string tableName;

	// カラム情報
    private static List<Tuple<string, PropertyInfo>> columns;

    public Dao()
    {
        if (tableName == null)
        {
            // Columnの情報
            columns = typeof(T).GetProperties()
                    .Select(p => new { p, Attributes = p.GetAttributes<ColumnAttribute>() })
                    .Where(a => a.Attributes.Length == 1)
                    .Select(a => Tuple.Create(a.Attributes[0].Name, a.p))
                    .ToList();
            if (!columns.Any())
            {
                throw new ApplicationException();
            }

            // Tableの情報
            var attributes = typeof(T).GetAttributes<TableAttribute>();
            if (attributes.Length != 1 || string.IsNullOrEmpty(attributes[0].Name))
            {
                throw new ApplicationException();
            }
            tableName = attributes[0].Name;
        }
    }
}

コンストラクタで、Tのクラス情報から属性値を読み込んでいます。
#静的コンストラクタで解析してもよいのですが、その場合、例外処理に困るので…
また、属性の取得のために、以下のような拡張メソッドを定義しています。

static class ExtensionMethods
{
    public static T[] GetAttributes<T>(this Type type) where T : Attribute
    {
        return type.GetCustomAttributes(typeof(T), true) as T[];
    }

    public static T[] GetAttributes<T>(this MemberInfo member) where T : Attribute
    {
        return member.GetCustomAttributes(typeof(T), true) as T[];
    }
}
広告

コメントする »

まだコメントはありません。

RSS feed for comments on this post. TrackBack URI

コメントを残す

以下に詳細を記入するか、アイコンをクリックしてログインしてください。

WordPress.com ロゴ

WordPress.com アカウントを使ってコメントしています。 ログアウト / 変更 )

Twitter 画像

Twitter アカウントを使ってコメントしています。 ログアウト / 変更 )

Facebook の写真

Facebook アカウントを使ってコメントしています。 ログアウト / 変更 )

Google+ フォト

Google+ アカウントを使ってコメントしています。 ログアウト / 変更 )

%s と連携中

WordPress.com Blog.

%d人のブロガーが「いいね」をつけました。