参照してください。 Castle ARはNHibernateフィルタへのマッピングのためのネイティブAPIを持っていないので、この部分はほとんど文書化されていません。だからここに行く。
この例のフィルタでは、あなたは関係なく、あなたはActiveRecordのに使うクエリの種類を、より古い年以上のニュースを得ることはありませんことを確認します。あなたはおそらくより実際的なアプリケーションを考えることができます。
まず、ActiveRecord "News"を作成します。
ActiveRecordStarterを初期化する前に、次のコードを使用してください。
ActiveRecordStarter.MappingRegisteredInConfiguration += MappingRegisteredInConfiguration;
Castle.ActiveRecord.Framework.InterceptorFactory.Create =() => { return new EnableFiltersInterceptor(); };
はその後、行方不明関数やクラスを追加します。
void MappingRegisteredInConfiguration(Castle.ActiveRecord.Framework.ISessionFactoryHolder holder)
{
var cfg = holder.GetConfiguration(typeof (ActiveRecordBase));
var typeParameters = new Dictionary<string, IType>
{
{"AsOfDate", NHibernateUtil.DateTime}
};
cfg.AddFilterDefinition(new FilterDefinition("Latest", "", typeParameters));
var mappings = cfg.CreateMappings(Dialect.GetDialect(cfg.Properties));
var newsMapping = cfg.GetClassMapping(typeof (News));
newsMapping.AddFilter("Latest", ":AsOfDate <= Date");
}
public class EnableFiltersInterceptor : EmptyInterceptor
{
public override void SetSession(ISession session)
{
session.EnableFilter("Latest").SetParameter("AsOfDate", DateTime.Now.AddYears(-1));
}
}
出来上がりを!ニュースに関するクエリ(例: FindAll()、DeleteAll()、FindOne()、Exists()などは1年以上経過したエントリに決して触れません。
出典
2009-09-03 21:07:02
mbp
これは良い解決策ですが、Castle ActiveRecordでこれらのフィルタを使用できるかどうかはわかりません。 – mbp
http://groups.google.com/group/castle-project-devel/browse_thread/thread/ce94f492615e0d52/c721a7abb0a1f1a7これは今まで実装されていなかったと思います...現在のセッションを取得してフィルタを有効にする自分自身 –
IIRC ActiveRecordMediator.GetSessionFactoryHolder()から現在のセッションを取得することができます。CreateSession(typeof(ActiveRecordBase)) –