Frage

Ich habe eine VB.NET-Modul bekommt, die aus einer Ressourcendatei liest Text in der richtigen Sprache angezeigt werden soll. Hier ist mein Problem - dieser Code zwischen einer Web-Anwendung gemeinsam genutzt und einer Nicht-Web-Anwendung, in der Web-Anwendung, ich bin mit System.Web.HttpContext des vom Benutzer bevorzugte Sprache zu bestimmen, aber jetzt meine Windows-Anwendung wird nicht einmal kompilieren , weil sie sagt, Httpcontext nicht definiert ist (ich habe bereits versucht, eine Import für den vollständigen Namespace hinzugefügt - keine Würfel).

Ich würde gerne eine Art von try / catch-Block verwenden, wenn ich nicht anders kann es umgehen, aber das ändert sich nicht, dass die Windows-Anwendung nicht mit einem Verweise auf Httpcontext in kompilieren. Ohne sich zu bewegen dieses Stück Code in eine neue Datei und darunter nur in der Web-Anwendung (ich besitze nicht, dass die App, so dass ich lieber nicht mit diesen Auswirkungen befassen), gibt es eine andere Wahl habe ich damit umgehen?

Wenn es keinen Sinn macht, lassen Sie es mich wissen, und ich werde mein Bestes tun, um zu klären.

LÖSUNG: Habe ich nur noch einen Verweis auf System.Web, die meine Anwendung erlaubt zu kompilieren. Ich wickelte auch die Httpcontext Referenz in einem „If HttpContext.Current Nothing Then isnot ... End If“ Block, der es verursacht über den Code zu überspringen, wenn es nicht als Web-Anwendung ausgeführt wird, das ist genau das, was ich suchte.

War es hilfreich?

Lösung

Wenn Sie die System.Web Assembly verweisen, sollten Sie dann Zugriff auf HttpContext.Current gegeben werden, das ist ein Verweis auf den aktuell laufenden Httpcontext-Objekt des Web-App. Wenn die Anwendung ein normaler Win32-App ist, sollte diese Referenz ein Null-Zeiger sein. So ist in C # verwenden Sie: if (HttpContext.Current == null) oder in VB könnten Sie verwenden: If HttpContext.Current Is Nothing Then

Aber ich habe nie versucht, etwas dieser Art zu tun, so kann ich das Ergebnis nicht garantieren. Lassen Sie mich wissen, ob das für Sie arbeitet.

Danke, C

Andere Tipps

Auch wenn die App kompilieren würden Sie das Problem nicht in Httpcontext WinApp bekommen würde.

Sie können die Webapp Refactoring, so dass anstelle von Httpcontext würde es einen Dienst zum Beispiel verwenden. IContextService oder ein Bündel von Dienstleistungen (ICacheService, ISessionService, etc.).

Es würde zwei Implementierungen des Dienstes sein: (. Sprache, usw.) ein für die Web-Anwendung, die Httpcontext und ein für den winapp verwenden würde die Umsetzung notwendige Logik enthalten würde Benutzereinstellungen bestimmen

.

Wenn die Einstellungen auf dem Server gespeichert sind, würden Sie brauchen eine Art von Service zu implementieren zwischen Ihrem winapp und dem Server zu kommunizieren.

Ich glaube, Sie ein wenig Entkopplung verwenden könnte!

Wenn Sie eine Schnittstelle wie diese schaffen würde (in Sie Schicht zum Beispiel BLL)

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

und you'de erstellen zwei Implementierungen:

Sie Website-Projekt:

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

In Ihrem WinForms Projekt:

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

Im folgenden verwenden Sie Inversion of Control (Unity, StructureMap, Microkernel) zu konfigurieren in Ihrem webconfig, dass eine Instanz von WebPeferredLanguage verwendet und soll in Ihrer WinForms zurückgegeben werden.

eine Singleton-Instanz von WinformsPeferredLanguage werden soll

In Ihrem Code, wenn Sie benötigen, die Sprache kennen, fragen Sie einfach die IoC-Container für die korrekte Umsetzung von IPreferredLanguage, und es wird ein Objekt des Typs zurück, die Sie konfigurieren haben.

so in Ihrem BLL könnten Sie (zum Beispiel) programmieren:

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

Nach diesem Schreiben, ich sehe, dass Sie eine VB.NET Lösung gesucht. Nun, die Beispiele noch gelten, nur es ist etwas anders Grammatik (sorry, wenn es schwieriger ist, auf diese Weise zu lesen).

Sie können System.Web.dll zu Ihrer Anwendung hinzufügen und dann Httpcontext verwenden. Das Problem ist, dass es ein Httpcontext isn't in Ihrer Anwendung zu gewinnen, so dass Sie einen Webdienst oder WCF kommunizieren zwischen den beiden Anwendungen verwendet werden sollen.

Wenn möglich, das wahrscheinlich am besten, was man tun könnte, ist völlig die Abhängigkeit entfernen auf einen HTTP-Kontext in der gemeinsamen Anordnung.

Zum Beispiel ist die Methode, die Sie erwähnen, die die Httpcontext verwendet, kann der Benutzer bevorzugt zu bekommen Refactoring werden, so dass die Sprache statt als Parameter angegeben wird. Wenn Sie die Methode aus Ihrer Web-Anwendung rufen Sie in der Sprache aus der Httpcontext passieren können, und wenn Sie es von der Windows-Anwendung aufrufen, werden Sie von einer anderen Quelle in der Sprache übergeben müssen.

Sie sollten verwenden

Thread.CurrentUICulture

die Benutzersprache zu bestimmen. Es wird in WinForms und WebApplication ebenfalls unterstützt.

Die .NET-Framework festgelegt, die für Sie in den meisten Fällen.

Sie können es einrichten, wenn Ihr Programm / Thread startet. In Web-Anwendung können Sie es in Global.asax.cs in Application_BeginRequest gesetzt.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top