微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – 如何使用PostSharp AOP获取当前NHibernate会话以使用Transaction属性?

我想获得当前的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] 举报,一经查实,本站将立刻删除。

相关推荐