NHibernate+C# Genericで汎用的なDAO を作成
2009/11/26 11:51Update
C#言語のGeneric(ジェネリック)で、NHibernateを使って汎用的なDAOを実装してみます。
DAOインターフェースの実装例
IDao.csusing 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.csusing 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");
.
Sponsored Link
- Relative Articles