2

我试图让开发人员在某些执行点扩展我的代码。

我的具体示例是数据库事务包装器。包装器负责处理我们希望从开发人员那里抽象出来的许多细节,并用于多个项目。

然而,每个项目都有他们希望在交易期间自动执行的某些事情。我想添加每个项目可以设置以运行代码的拦截点。

例如,我们数据库中的每个表都有一个输入日期字段,每次记录更改时都会更新该字段。然而,我们希望一个事务的所有日期都是相同的,无论有多少记录被触及(即表 A 中的 4 条记录,表 B 中的 1 条记录,...)。

我的想法是定义拦截点“TransactionStarting”、“TransactionStarted”、“StatementExecuting”、“StatementExecuted”……并将一个上下文对象传递给每个点。

然后项目可以定义一个类“EnteredDateManager”,它在“TransactionStarted”点期间存储当前日期,并在“StatementExecuting”点期间更新每个对象的 EnteredDate 属性。

我想在 web/app.config 文件中进行设置,并允许注册多个拦截类。如果注册了多个班级,则应按照注册的顺序解雇他们。

我想只是提出事件,但我希望秩序很重要。我还希望能够在不同点之间共享状态。在我上面的示例中,EnteredDate 属性在 TransactionStarted 点中设置并在 StatementExecuting 点中使用。

这是责任链模式吗?奥普?它似乎接近 ASP.Net 管道的工作方式,但据我所知,它们使用事件并且不保证排序。

任何方向/例子都会很棒。

谢谢

4

3 回答 3

1

对我来说,这听起来像是面向方面的编程。查看PostSharp

这是从他们的网站进行跟踪的示例:

public class TraceAttribute : OnMethodBoundaryAspect 
{ 
  public override void OnEntry( MethodExecutionEventArgs eventArgs) 
  { Trace.TraceInformation("Entering {0}.", eventArgs.Method);  } 

  public override void OnExit( MethodExecutionEventArgs eventArgs) 
  { Trace.TraceInformation("Leaving {0}.", eventArgs.Method);   } 
}

我用它来做日志/跟踪、缓存和性能监控。

于 2009-08-24T22:52:39.840 回答
0

一种方法是只使用基本的策略模式。使用 Strategy,您基本上是将功能推送到一个单独的类中,该类将由您的类调用,而不是直接在原始类中实现逻辑。策略类可以通过基于接口的属性或构造函数参数(或两者)设置来包含在原始类中。这样,用户可以选择将不同类型的功能注入到原始类定义的某些处理流程中。

于 2009-08-24T22:12:36.830 回答
0

如果这是 .NET 特定的(您提到了 ASP.NET),我强烈建议您查看 System.Transactions 命名空间,并阅读有关在事务中创建和注册资源管理器的信息。

使用 TransactionScope,您可以在上下文中创建事务,并且在该上下文中执行的资源管理器可以检测到事务的存在并在其中注册(这将与您的 TransactionStart 事件同义)。注册后,每个资源管理器都可以选择提交其更改,或者退出并启动事务的回滚。

.NET 2.0 引入的 Systen.Transactions 命名空间提供了一些非常强大的工具来创建事务和管理事务资源。您可以选择轻量级事务,或者如果您的需要更复杂,则可以选择由 MSDTC 服务管理的完全分布式事务。事务可以是单阶段提交,也可以是两阶段提交,在面对事务失败时提供了很大的灵活性和稳定性。

于 2009-08-24T22:14:48.417 回答