代码之家  ›  专栏  ›  技术社区  ›  Mike Schall

允许在某些点注入代码的设计模式

  •  2
  • Mike Schall  · 技术社区  · 15 年前

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

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

    但是,每个项目都有一些他们希望在事务处理期间自动执行的操作。我想添加拦截点,每个项目可以设置运行代码。

    例如,数据库中的每个表都有一个输入的日期字段,该字段在记录每次更改时都会更新。但是,我们希望一个事务的所有日期都是相同的,不管有多少条记录被触碰(即表a中的4条记录,表B中的1条记录,…)。

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

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

    我想在web/app.config文件中设置它,并允许注册多个拦截类。如果注册了多个类,则应按照注册的顺序激发它们。

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

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

    任何方向/例子都很好。

    谢谢

    3 回复  |  直到 15 年前
        1
  •  1
  •   Chris McCall    15 年前

    听起来像是面向方面的编程。退房 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);   } 
    }
    

    我使用它来进行日志/跟踪、缓存和性能监视。

        2
  •  0
  •   Andy White    15 年前

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

        3
  •  0
  •   jrista    15 年前

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

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

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

    推荐文章