Question

J'ai un module VB.NET qui lit un fichier de ressources pour afficher le texte dans la langue correcte. Voici mon problème - ce code est partagé entre une application Web et une application non Web. Dans l'application Web, j'utilise System.Web.HttpContext pour déterminer la langue préférée de l'utilisateur, mais maintenant, mon application Windows ne sera même pas compilée. , parce qu’il indique que HttpContext n’est pas défini (j’ai déjà essayé d’ajouter des importations pour l’espace de noms complet - pas de dés).

J'aimerais utiliser un bloc try / catch si je ne peux pas le contourner, mais cela ne change pas le fait que l'application Windows ne compilera pas avec une référence à HttpContext. Sans déplacer cette partie de code dans un nouveau fichier et l'inclure uniquement dans l'application Web (je ne suis pas propriétaire de cette application, je préfère donc ne pas gérer ces implications), y a-t-il un autre choix pour moi de gérer cela?

Si cela n’a aucun sens, faites-le-moi savoir et je ferai de mon mieux pour vous éclairer.

SOLUTION: je viens d'ajouter une référence à System.Web, ce qui a permis à mon application de se compiler. J'ai également enveloppé la référence HttpContext dans un "Si HttpContext.Current n'est pas rien alors ... Fin si" block, ce qui le fait ignorer le code s’il n’est pas exécuté en tant qu’application Web, c’est exactement ce que je cherchais.

Était-ce utile?

La solution

Si vous référencez l'assembly System.Web, vous devriez alors avoir accès à HttpContext.Current, qui est une référence à l'objet HttpContext de l'application Web en cours d'exécution. Si l'application est une application Win32 normale, cette référence doit être un pointeur null. Ainsi, en C #, vous utiliseriez: if (HttpContext.Current == null) ou en VB, vous pouvez utiliser: Si HttpContext.Current n'est rien alors

Cependant, je n'ai jamais essayé de faire quelque chose de ce genre, donc je ne peux pas garantir le résultat. Faites-moi savoir si cela fonctionne pour vous.

Merci, C

Autres conseils

Même si l'application se compilait, le problème de l'absence de HttpContext dans WinApp serait résolu.

Vous pouvez refactoriser la webapp pour qu’à la place de HttpContext, elle utilise un service, par exemple. IContextService ou un ensemble de services (ICacheService, ISessionService, etc.).

Il y aurait deux implémentations du service: l’une pour l’application Web qui utiliserait HttpContext et l’autre pour l’application Winapp, laquelle implémenterait la logique nécessaire pour déterminer les préférences de l’utilisateur (langue, etc.).

Si les préférences sont stockées sur le serveur, vous devez implémenter un type de service pour communiquer entre votre winapp et le serveur.

Je pense que vous pourriez utiliser un peu de découplage!

Si vous voulez créer une interface comme celle-ci (dans votre couche BLL par exemple)

public interface IPreferredLanguage
{
     String PeferredLanguage { get; set; }
}

et vous créez deux implémentations:

Dans votre projet de site Web:

public class WebPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get
          {
               return // retrieve the language from the http context
          }
          set
          {
               // set the preferred language in the HttpContext
          }
     } 
}

Dans votre projet Winforms:

public class WinformsPeferredLanguage : IPreferredLanguage
{
     public String PeferredLanguage
     {
          get; set; // automatic properties
     } 
}

Vous utilisez ensuite Inversion de contrôle (Unity, StructureMap, MicroKernel) pour configurer webconfig qu'une instance de WebPeferredLanguage soit utilisée et qu'une instance singleton de WinformsPeferredLanguage soit renvoyée dans vos winforms.

Dans votre code, chaque fois que vous avez besoin de connaître la langue, il vous suffit de demander au conteneur IoC la bonne implémentation de IPreferredLanguage, qui renvoie alors un objet du type que vous avez configuré.

vous pouvez donc programmer dans votre bll (par exemple):

public String GetEmailMessage()
{
    var currentLanguage = IoC.Resolve<IPreferredLanguage>().PeferredLanguage;
    return Resources[currentLanguage ].EmailMessage;
}

Après avoir écrit cela, je vois que vous vouliez une solution VB.NET. Eh bien, les exemples sont toujours valables, sauf que la grammaire est légèrement différente (désolé si c'est plus difficile à lire de cette façon).

Vous pouvez ajouter System.Web.dll à votre application, puis utiliser HttpContext. Le problème est qu’il n’ya pas de HttpContext dans votre application gagnante. Vous devez donc utiliser un service Web ou une WCF pour communiquer entre les deux applications.

Si possible, la meilleure chose à faire est probablement de supprimer complètement la dépendance à un contexte HTTP dans l'assembly partagé.

Par exemple, la méthode que vous mentionnez et qui utilise HttpContext pour obtenir les préférences de l'utilisateur peut être refactorisée afin que la langue soit donnée en paramètre. Lorsque vous appelez la méthode à partir de votre application Web, vous pouvez transmettre la langue à partir de HttpContext. Lorsque vous appelez cette méthode à partir de l'application Windows, vous devez la transmettre à partir d'une autre source.

Vous devriez utiliser

Thread.CurrentUICulture

pour déterminer la langue de l'utilisateur. Il est également pris en charge dans WinForms et WebApplication.

Le framework .NET le définit pour vous dans la plupart des cas.

Vous pouvez le configurer au démarrage de votre programme / thread. Dans une application Web, vous pouvez le définir dans Global.asax.cs dans Application_BeginRequest.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top