gpt4 book ai didi

c# - 如何使用 PostSharp AOP 获取当前 NHibernate session 以使用 Transaction 属性?

转载 作者:行者123 更新时间:2023-11-30 12:42:53 26 4
gpt4 key购买 nike

我想通过 PostSharp AOP 获取当前的 NHibernate session 以使用 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);
}

最佳答案

"Consuming Dependencies"在 PostSharp 文档的部分,您可以找到有关将依赖项注入(inject)方面的不同方法的描述和示例。

一种常见的方法是让依赖项注入(inject)容器初始化现有方面实例的依赖项。您可以从方面的 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 容器作为方面内的全局服务定位器 - 只需要求容器为您检索所需的实例。作为优化,您可能还想将 session 存储在 MethodExecutionArgs.MethodExecutionTag 中。 OnEntry 方法中的属性,并在 OnSuccessOnException 方法中检索它。

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

// ...
}

关于c# - 如何使用 PostSharp AOP 获取当前 NHibernate session 以使用 Transaction 属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32501288/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com