2009-08-24 50 views
2

我试图让开发人员在特定的执行点上扩展我的代码。允许代码在特定点注入的设计模式

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

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

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

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

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

我想在web/app.config文件中设置它,并允许注册多个拦截类。如果不止一个班级被注册,他们应该按照他们注册的顺序被解雇。

我正在考虑提高事件,但我想要重要的事情。我也希望能够分享不同点之间的状态。在我上面的示例中,EnteredDate属性设置在TransactionStarted点中并用于StatementExecuting点。

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

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

谢谢

回答

0

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

0

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

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

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

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); } 
} 

我用它做记录/追踪,缓存和性能监控。