我想获得当前的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文档的
@L_404_0@部分中,您可以找到将依赖项注入方面的不同方法的描述和示例.
一种常见的方法是让依赖注入容器初始化现有方面实例的依赖关系.您可以从方面的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() { } // ... }
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。