Saya akhirnya menemukan solusi hebat (menggunakan filter). Karena Castle AR tidak memiliki API asli untuk memetakan ke filter NHibernate, bagian ini hampir tidak terdokumentasi. Jadi begini.
Contoh filter ini, akan memastikan Anda tidak akan pernah mendapatkan berita lebih dari satu tahun, apa pun jenis kueri yang Anda gunakan di ActiveRecord. Anda mungkin bisa memikirkan penerapan yang lebih praktis untuk ini.
Pertama, buat "Berita" ActiveRecord.
Gunakan kode berikut sebelum Anda menginisialisasi ActiveRecordStarter.
ActiveRecordStarter.MappingRegisteredInConfiguration += MappingRegisteredInConfiguration;
Castle.ActiveRecord.Framework.InterceptorFactory.Create = () => { return new EnableFiltersInterceptor(); };
Kemudian, tambahkan fungsi dan kelas yang hilang:
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));
}
}
Dan voila! Pertanyaan tentang Berita, mis. FindAll(), DeleteAll(), FindOne(), Exists(), dll. tidak akan pernah menyentuh entri yang berumur lebih dari satu tahun.
person
mbp
schedule
03.09.2009