hjavaher
hjavaher

Reputation: 2609

Global Variables in ASP.NET MVC 4

I'm currently building an ASP.Net MVC 4 SAAS application (C#) and am stuck on designing the plans. I mean if a customer picks Plan A they should have access to some things and if they pick Plan B they get access to others and so on.

The Part that I'm stuck on is be best practice of sharing the account's plan with all of the actions. I realize having global variables are bad practice and all but I really don't want to take round trips to the DB to get the plan on every action.

What I'm thinking of doing is something like This SO answer where they just declare a static model and set it at some point and access it later on. In your opinion, is this the best way of doing this? is there a better way?

Upvotes: 2

Views: 8855

Answers (1)

Khanh TO
Khanh TO

Reputation: 48972

I think best practice is you should include an IoC in your project and inject a configuration object to your controller.

Example code of a controller:

public class YourController : Controller
 {
     private IConfigService _configService;

     //inject your configuration object here.
     public YourController(IConfigService configService){
           // A guard clause to ensure we have a config object or there is something wrong
           if (configService == null){
               throw new ArgumentNullException("configService");
           }
           _configService = configService;
     }
 }

You could configure your IoC to specify singleton scope for this configuration object. In case you need to apply this pattern to all your controllers, you could create a base controller class to reuse code.

Your IConfigService

public interface IConfigService
{
    string ConfiguredPlan{ get; }
}

Your ConfigService:

public class ConfigService : IConfigService
{
    private string _ConfiguredPlan = null;

    public string ConfiguredPlan
    {
        get
        {
            if (_ConfiguredPlan == null){
                    //load configured plan from DB
            }
            return _ConfiguredPlan;
        }
    }
}
  • This class is easily extended to include more configurations like connection String, Default timeout,...
  • We're passing in an interface to our controller class, it's easy for us to mock this object during unit testing.

Upvotes: 5

Related Questions