c# – 如何使用PostSharp AOP获取当前NHibernate会话以使用Trans
发布时间:2020-12-15 22:20:07 所属栏目:百科 来源:网络整理
导读:我想获得当前的NHibernate Session以使用PostSharp AOP使用Transaction属性. 而不是下面, public void CreateTEntity(TEntity entity) where TEntity : class,IIdentity{ var session = SessionFactory.CurrentSession; using (ITransaction transaction = s
我想获得当前的NHibernate Session以使用PostSharp AOP使用Transaction属性.
而不是下面, public void Create<TEntity>(TEntity entity) where TEntity : class,IIdentity { var session = SessionFactory.CurrentSession; using (ITransaction transaction = session.BeginTransaction()) { try { session.Save(entity); transaction.Commit(); } catch { transaction.Rollback(); throw; } } } 我想这样用, [NHibernateTransaction] public void Create<TEntity>(TEntity entity) where TEntity : class,IIdentity { session.Save(entity); } 解决方法
在PostSharp文档的
“Consuming Dependencies”部分中,您可以找到将依赖项注入方面的不同方法的描述和示例.
一种常见的方法是让依赖注入容器初始化现有方面实例的依赖关系.您可以从方面的RuntimeInitialize方法执行此操作.例如,使用StructureMap容器??: [Serializable] public class NHibernateTransactionAttribute : OnMethodBoundaryAspect { public ISessionFactory SessionFactory { get; set; } public override void RuntimeInitialize(MethodBase method) { // Initialize the SessionFactory according to the container configuration. ObjectFactory.BuildUp(this); } // ... } 另一种解决方案是使用DI容器作为方面内的全局服务定位器 – 只需要求容器为您检索所需的实例.作为优化,您可能还希望将会话存储在OnEntry方法内的MethodExecutionArgs.MethodExecutionTag属性中,并在OnSuccess和OnException方法中检索它. public override void OnEntry(MethodExecutionArgs args) { ISessionFactory sessionFactory = ObjectFactory.GetInstance<ISessionFactory>(); var session = SessionFactory.CurrentSession; // Store the session in the method context. args.MethodExecutionTag = session; // ... } public override void OnSuccess(MethodExecutionArgs args) { // Retrieve the session from the method context. var session = (ISession) args.MethodExecutionTag; // ... } 使用PostSharp专业版,您还可以将目标类的属性和方法导入到方面.因此,如果您的类具有SessionFactory属性,则可以在方面内导入和使用它.请注意,在这种情况下您还需要实现IInstanceScopedAspect. [Serializable] public class NHibernateTransactionAttribute : OnMethodBoundaryAspect,IInstanceScopedAspect { [ImportMember("SessionFactory",IsRequired = true)] public Property<ISessionFactory> SessionFactoryProperty; public override void OnEntry(MethodExecutionArgs args) { var session = this.SessionFactoryProperty.Get().CurrentSession; // ... } object IInstanceScopedAspect.CreateInstance(AdviceArgs adviceArgs) { return this.MemberwiseClone(); } void IInstanceScopedAspect.RuntimeInitializeInstance() { } // ... } (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |