代码之家  ›  专栏  ›  技术社区  ›  Jamie Clayton

监视用户在.NET应用程序中执行的操作并触发应用程序功能更改

  •  1
  • Jamie Clayton  · 技术社区  · 16 年前

    我需要一些关于如何实现一个非常基本的机制的建议,该机制记录多个用户在应用程序中所做的工作。当另一个功能运行时,我需要更改应用程序,以限制功能。

    用例示例 用户可以正常编辑未付款记录。如果应用程序随后运行一个Payrun进程(long),那么我需要更改应用程序的某些部分,以在短时间内限制功能(例如,将现有的未付款记录设为只读)。

    关于如何在.NET应用程序中执行此操作有何建议?

    架构详细信息

    • VS 2008/2010,
    • SQL Server 2005/2005,
    • CSLA框架3.8,
    • 图书管理系统
    • Windows 2008 Web服务器场
    • 900用户

    该解决方案是一个只读的Extranet Web报告应用程序和内部(防火墙)数据输入和数据处理应用程序(小单输入和大批量数据导入)。

    1 回复  |  直到 16 年前
        1
  •  1
  •   Cade Roux    16 年前

    通常,我们在数据库层处理这一点,因为单独计算机上的各个应用程序彼此并不直接了解。应用程序可以在执行操作之前或定期检查数据库本身,或者底层存储过程可以使用某种简单的表和信号量锁定来管理模式。

    在单台服务器上的非分布式Web应用程序上,您可以使用应用程序对象相当容易地处理这一问题,因为实际上只有一个应用程序,而且它可以相当容易地监视用户活动。

    假设您只有两种模式,并且所有内容都在存储过程中处理:

    一个用户进行某种过账操作和正常模式的模式。假设过账操作中的操作相对简单,为了清楚起见,我们将省略确保没有竞争条件的代码,并将所有代码内联,而不是封装到其他SP或函数中:

    CREATE PROCEDURE Post
    AS
    BEGIN
        UPDATE ModeControl
        SET Mode = 'POSTING'
    
    
        UPDATE Payments
        SET Whatever = whatever
        WHERE whatever
    
        UPDATE ModeControl
        SET Mode = 'NORMAL'
    END
    
    CREATE PROCEDURE IsPosting -- poll this in your app or before performing operations
    AS
    BEGIN
        IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
            RETURN 1
        ELSE
            RETURN 0
    END
    
    CREATE PROCEDURE Normal1
    AS
    BEGIN
        -- Catches potential problems at database even though app shouldn't call in 'POSTING' more
        IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
            RAISERROR...
    
        -- Perform Normal1 operations
    END
    
    CREATE PROCEDURE Normal2
    AS
    BEGIN
        IF EXISTS (SELECT * FROM ModeControl WHERE Model = 'POSTING')
            RAISERROR...
    
        -- Perform Normal2 operations
    END
    

    显然,如果您有一个完整的数据访问层和一些框架位,那么您可以修饰您的方法,并使用反射来自动分类您的方法,并用关于不允许的模式的检查将它们包装起来,以将其绑定到某种状态机类型的东西中。

    推荐文章