web-dev-qa-db-fra.com

Variables globales ASP.NET MVC

Comment déclarez-vous les variables globales dans ASP.NET MVC?

66
Beginner
public static class GlobalVariables
{
    // readonly variable
    public static string Foo
    {
        get
        {
            return "foo";
        }
    }

    // read-write variable
    public static string Bar
    {
        get
        {
            return HttpContext.Current.Application["Bar"] as string;
        }
        set
        {
            HttpContext.Current.Application["Bar"] = value;
        }
    }
}
43
abatishchev

Techniquement, toute variable statique ou propriété d'une classe, n'importe où dans votre projet, sera une variable globale, par ex.

public static class MyGlobalVariables
{
    public static string MyGlobalString { get; set; }
}

Mais comme le dit @SLaks, ils peuvent «potentiellement» être une mauvaise pratique et dangereux, s'ils ne sont pas gérés correctement. Par exemple, dans l'exemple ci-dessus, vous auriez plusieurs demandes (threads) essayant d'accéder à la même propriété, ce qui pourrait poser problème s'il s'agissait d'un type complexe ou d'une collection, vous devrez donc implémenter une forme de verrouillage.

77
Sunday Ironfoot

Vous pouvez les mettre dans l'application:

Application["GlobalVar"] = 1234;

Ils sont uniquement globaux dans l'application actuelle IIS/Virtual. Cela signifie que, sur une ferme Web, ils sont locaux sur le serveur et dans le répertoire virtuel qui est la racine de l'application.

24
GvS

Pour non-static variables, je l'ai trié via Dictionnaire de classe d'application comme ci-dessous:

Chez Global.asax.ac:

namespace MvcWebApplication 
{ 
    // Note: For instructions on enabling IIS6 or IIS7 classic mode, 
    // visit http://go.Microsoft.com/?LinkId=9394801 

    public class MvcApplication : System.Web.HttpApplication 
    { 
        private string _licensefile; // the global private variable

        internal string LicenseFile // the global controlled variable
        { 
            get 
            { 
                if (String.IsNullOrEmpty(_licensefile)) 
                { 
                    string tempMylFile = Path.Combine(Path.GetDirectoryName(Assembly.GetAssembly(typeof(LDLL.License)).Location), "License.l"); 
                    if (!File.Exists(tempMylFile)) 
                        File.Copy(Server.MapPath("~/Content/license/License.l"), 
                            tempMylFile, 
                            true); 
                    _licensefile = tempMylFile; 
                } 
                return _licensefile; 
            } 
        }
        protected void Application_Start()
        {
            Application["LicenseFile"] = LicenseFile;// the global variable's bed

            AreaRegistration.RegisterAllAreas();

            RegisterGlobalFilters(GlobalFilters.Filters);
            RegisterRoutes(RouteTable.Routes);
        }
    }
}

Et dans le contrôleur:

namespace MvcWebApplication.Controllers
{
    public class HomeController : Controller
    {
        //
        // GET: /Home/

        public ActionResult Index()
        {
            return View(HttpContext.Application["LicenseFile"] as string);
        }

    }
}

De cette façon, nous pouvons avoir des variables globales dans ASP.NET MVC :)

NOTE: Si votre objet n'est pas une chaîne, écrivez simplement:

return View(HttpContext.Application["X"] as yourType);
18
Yasser Zamani

Vous pouvez également utiliser une classe statique, telle qu'une classe de configuration ou quelque chose du genre ...

public static class Config
{
    public static readonly string SomeValue = "blah";
}
8
Ian P

L’acier est loin d’être chaud, mais j’ai combiné la solution de @ abatishchev avec la réponse de cet article et j’ai obtenu ce résultat. J'espère que c'est utile:

public static class GlobalVars
{
    private const string GlobalKey = "AllMyVars";

    static GlobalVars()
    {
        Hashtable table = HttpContext.Current.Application[GlobalKey] as Hashtable;

        if (table == null)
        {
            table = new Hashtable();
            HttpContext.Current.Application[GlobalKey] = table;
        }
    }

    public static Hashtable Vars
    {
        get { return HttpContext.Current.Application[GlobalKey] as Hashtable; }
    }

    public static IEnumerable<SomeClass> SomeCollection
    {
        get { return GetVar("SomeCollection") as IEnumerable<SomeClass>; }
        set { WriteVar("SomeCollection", value); }
    }

    internal static DateTime SomeDate
    {
        get { return (DateTime)GetVar("SomeDate"); }
        set { WriteVar("SomeDate", value); }
    }

    private static object GetVar(string varName)
    {
        if (Vars.ContainsKey(varName))
        {
            return Vars[varName];
        }

        return null;
    }

    private static void WriteVar(string varName, object value)
    {
        if (value == null)
        {
            if (Vars.ContainsKey(varName))
            {
                Vars.Remove(varName);
            }
            return;
        }

        if (Vars[varName] == null)
        {
            Vars.Add(varName, value);
        }
        else
        {
            Vars[varName] = value;
        }
    }
}
0
paulo.vin