NHibernate+C# Genericで汎用的なDAO を作成

2009/11/26 11:51Update
TAGS: Generic | DAO | C# | ジェネリック | NHibernate

C#言語のGeneric(ジェネリック)で、NHibernateを使って汎用的なDAOを実装してみます。

DAOインターフェースの実装例


IDao.cs
using System;
using System.Collections.Generic;
using NHibernate;

namespace NHibernate.Dao
{
    public interface IDao <T>
    {
        /// <summary>
        /// IDからオブジェクト取得
        /// </summary>
        /// <param name="id">ID</param>
        /// <returns></returns>
        T Get(String id);

        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="obj">保存対象オブジェクト</param>
        /// <returns></returns>
        T Save(T obj);

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="obj">更新対象オブジェクト</param>
        void Update(T obj);

        /// <summary>
        /// 削除
        /// </summary>
        /// <param name="obj">削除対象オブジェクト</param>
        void Delete(T obj);

        /// <summary>
        /// クエリ名からクエリ作成
        /// </summary>
        /// <param name="queryName">クエリ名</param>
        /// <returns>IQuery</returns>
        IQuery GetNamedQuery(String queryName);

        /// <summary>
        /// クエリ作成
        /// </summary>
        /// <param name="queryString">クエリ文字列</param>
        /// <returns>IQuery</returns>
        IQuery CreateQuery(String queryString);

        /// <summary>
        /// クエリ作成
        /// </summary>
        /// <param name="queryString">クエリ文字列</param>
        /// <returns>ISQLQuery</returns>
        ISQLQuery CreateSQLQuery(String queryString);

        /// <summary>
        /// Criteria作成
        /// </summary>
        /// <returns>ICriteria</returns>
        ICriteria CreateCriteria();
    }
}


DAOクラスの実装例



ApplicationDAO.cs
using System;
using System.Collections.Generic;
using NHibernate;
using NHibernate.Utils;

namespace NHibernate.Dao
{
    public class ApplicationDao<T> : IDao<T>
    {
        ISession GetCurrentSession()
        {
            ISession session = NHibernateHelper.GetCurrentSession();
            return session;
        }

        /// <summary>
        /// IDからオブジェクト取得
        /// </summary>
        /// <param name="id"></param>
        /// <returns>対象オブジェクト</returns>
        public T Get(String id)
        {
            ISession session = GetCurrentSession();

            T t = (T)session.Get(typeof(T), id);

            return t;
        }

        /// <summary>
        /// 保存
        /// </summary>
        /// <param name="obj">保存対象オブジェクト</param>
        /// <returns>保存された対象オブジェクト</returns>
        public T Save(T obj)
        {
            ISession session = GetCurrentSession();
            return (T)session.Save(obj);
        }

        /// <summary>
        /// 更新
        /// </summary>
        /// <param name="obj">更新対象オブジェクト</param>
        public void Update(T obj)
        {
            ISession session = GetCurrentSession();
            session.Update(obj);
        }

        /// <summary>
        /// 削除
        /// </summary>
        /// <param name="obj">削除対象オブジェクト</param>
        public void Delete(T obj)
        {
            ISession session = GetCurrentSession();
            session.Delete(obj);
        }

        /// <summary>
        /// クエリ名からクエリ作成
        /// </summary>
        /// <param name="queryName">クエリ名</param>
        /// <returns>IQuery</returns>
        public IQuery GetNamedQuery(String queryName)
        {
            ISession session = GetCurrentSession();
            return session.GetNamedQuery(queryName);
        }

        /// <summary>
        /// クエリ作成
        /// </summary>
        /// <param name="queryString">クエリ文字列</param>
        /// <returns>IQuery</returns>
        public IQuery CreateQuery(String queryString)
        {
            ISession session = GetCurrentSession();
            return session.CreateQuery(queryString);
        }

        /// <summary>
        /// クエリ作成
        /// </summary>
        /// <param name="queryString">クエリ文字列</param>
        /// <returns>ISQLQuery</returns>
        public ISQLQuery CreateSQLQuery(String queryString)
        {
            ISession session = GetCurrentSession();
            return session.CreateSQLQuery(queryString);
        }

        /// <summary>
        /// Criteria作成
        /// </summary>
        /// <returns>ICriteria</returns>
        public ICriteria CreateCriteria()
        {
            ISession session = GetCurrentSession();
            return session.CreateCriteria(typeof(T));
        }
    }
}


実装クラスにNHibernateHelperというヘルパークラスをを利用しています。

NHibernateHelperについて、次の記事をご参照ください。

NHibernateを利用しやすくなるヘルパークラスの実装 - NHibernateHelper例

DAOの使い方


IDao<MyTable> dao = new ApplicationDao<MyTable>();
MyTable myTable = dao.Get("123");

.

有关作者
Syboos.jp編集長システム設計や開発、保守運営などを行ってます。オープンソース技術に興味があります。

Sponsored Link


Comments

  • Relative Articles