加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

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()
    {
    }

    // ...
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读