7
votes

Génération de nombres aléatoires dans les applications MVC

Quelle est la bonne façon de générer des nombres aléatoires dans une application ASP.NET MVC si j'ai besoin d'un nombre exactement par demande? Selon MSDN, afin d'obtenir une aléatoire de qualité suffisante, il est nécessaire de générer plusieurs numéros à l'aide d'un seul objet System.Random, créé une fois. Étant donné qu'une nouvelle instance d'une classe de contrôleur est créée pour chaque demande en MVC, je ne peux pas utiliser un champ privé initialisé dans le constructeur du contrôleur pour l'objet aléatoire. Donc, dans quelle partie de l'application MVC devrais-je créer et stocker l'objet aléatoire? Actuellement, je le stocke dans un champ statique de la classe du contrôleur et l'initialisez paresseusement dans la méthode d'action qui l'utilise: xxx

puisque le champ "aléatoire" est accessible par plusieurs instances du contrôleur. classe, est-il possible que sa valeur soit corrompue si deux instances tentent de l'initialiser simultanément? Et une autre question: Je sais que la durée de vie de la statique est la durée de vie de l'application, mais dans le cas d'une application MVC, qu'est-ce qui est? Est-ce de iis startup jusqu'à l'arrêt IIS?


0 commentaires

3 Réponses :


1
votes

Vous pouvez avoir un rétroducteur statique dans HOMECONTROLLER CODE> pour vous enregistrer après l'initialisation paresseux dans chaque méthode. Ceci veille à ce que le aléatoire code> est initialisé une seule fois (la toute première fois que c'est accessible).

public class HomeController : Controller
{
    ...

    private static Random random;

    static HomeController()
    {
        random = new Random();
    }

    ...

    public ActionResult Download()
    {
        ...

        //use random - its already created.


        ...

    }
}


0 commentaires

3
votes

Sauf si vous jetez une démonstration rapide ou quelque chose comme ça, je mettrais cette responsabilité dans une couche de service ou d'infrastructure (c'est-à-dire une autre classe) et laissez-la gérer la durée de vie de votre générateur de nombres aléatoires. Ce n'est pas vraiment le travail du contrôleur pour le gérer de toute façon - et vous n'aurez pas d'inquiéter à ce sujet lorsque / si vous avez un autre contrôleur qui nécessite un nombre aléatoire.


0 commentaires

12
votes

Idéalement, vous souhaitez conserver une instance de la classe code> aléatoire code> plus longtemps que la durée de vie d'une page unique. Faire pas strong> le faire en la mettant dans une variable statique; La classe code> aléatoire de n'est pas du thread-coffre-fort et cela entraînera des problèmes. De The Docs :

Tous les membres d'instance ne sont pas garantis pour être un fil de sécurité. P> blockQuote>

Mon approche préférée est le RandomGen2 une classe d'emballage de l'équipe Microsoft Parallelfx (qui connaît vraiment ce qu'ils font avec le filetage) qui utilise une instance par fil pour (principalement) numéros aléatoires sans verrou et sans sécurité. P>

var rand = RandomGen2.Next();


0 commentaires