tags:

views:

57

answers:

1

I need some suggestions for how to implement a very basic mechanism that logs what multiple users are doing in an application. When another feature is running I then need to change the application, to restrict functionality.

Use Case Example User can normaly edit unpaid records. If the application then runs a Payrun process (Long), I need to then change parts of the application to restrict functionality for a short period of time (eg. Make existing unpaid records readonly).

Any suggestions on how I can do this in a .net application?

Architecture details

  • VS 2008/2010,
  • SQL Server 2005/2005,
  • CSLA framework 3.8,
  • VB.net
  • Windows 2008 Web server farm
  • 900 + Users

The solution is an readonly extranet web reporting application and internal (firewall) data entry and data processing application (small single entry and large batch importing of data).

+1  A: 

Normally we handle that in the database layer, since the individual applications on separate computers aren't directly aware of each other. The apps can check the database themselves prior to performing an operation or on a regular basis, or underlying stored procedures can manage the modality using some kind of simple table and locking for the semaphore.

On a non-distributed web application on a single server, you can handle this fairly easy with the Application object, since there really is one Application and it can monitor user activity fairly easily.

Let's assume you have just two modes and everything is handled in stored procs:

Mode where one user in doing some kind of POSTING operation and NORMAL mode. Let's assume that the operations in the POSTING operation are relatively simple, and for clarity we'll leave out the code which ensures no race conditions, and have all code inline instead of encapsulated into other SPs or functions:

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

Obviously, if you have a full-blown data access layer and some framework bits, you can decorate your methods and use reflection to automatically categorize your methods and wrap them with checks about the unallowed modes to tie it into some kind of state-machine-type thing.

Cade Roux
I aggree that you need to handle that in the central database for an application. I'm really looking for a basic methodology of how to store and use that information. This is my first attempt at a solution, so I'm hoping to get some input from those with existing solutions.
Jamie Clayton
By reading and writing to the database. If you want a more specific answer, you'll need to ask a more specific questions. I believe that the questions was answered well considering you gave approximately one detail of your app - .NET.
sims
@Jamie Clayton - can you give more information about your current architecture?
Cade Roux
Cade Roux, Thanks for the detailed database approach. That was excellent example!Sims, your point is noted. I'll be more explicit in the future.BTW - My architecture is VS 2008/2010, SQL Server 2005/2005, CSLA framework 3.8, VB.net, Windows 2008 Web servers. The solution is an readonly extranet web reporting application and internal (firewall) data entry and data processing application (small single entry and large batch importing of data).
Jamie Clayton
@Jamie Clayton If you are doing this in CSLA, check out the CSLA forums (http://forums.lhotka.net/forums/) for advice on this - CSLA is a framework where you really want to try to avoid working around it. I assume you would do this kind of thing in/in conjunction with the DataPortal - but if batch importing is going around CSLA (for performance), this might get tricky.
Cade Roux
I've got batch importing implemented with CSLA and the performance is acceptable. See http://forums.lhotka.net/forums/p/7874/38367.aspx It has reduced performance, but I'll do a cross post just in case. Thanks again.
Jamie Clayton
CSAL cross reference post at http://forums.lhotka.net/forums/t/8941.aspx
Jamie Clayton