문제

리소스 파일에서 읽은 vb.net 모듈이 올바른 언어로 텍스트를 표시합니다. 내 문제는 다음과 같습니다.이 코드는 웹 응용 프로그램과 비 WEB 애플리케이션간에 공유됩니다. 웹 응용 프로그램에서 System.Web.httpContext를 사용하여 사용자의 선호 언어를 결정하지만 이제 Windows 앱이 컴파일되지 않습니다. HTTPContext가 정의되지 않았기 때문에 (이미 정식 네임 스페이스에 대한 가져 오기를 추가하려고 시도했습니다 - 주사위 없음).

다른 방법으로 작업 할 수없는 경우 시도/캐치 블록을 사용하고 싶습니다. 그러나 Windows 앱이 HTTPContext를 참조하여 컴파일하지 않아도됩니다. 이 코드 덩어리를 새 파일로 옮기지 않고 웹 애플리케이션에만 포함하지 않으면 (해당 앱을 소유하지 않으므로 오히려 그 의미를 다루지 않을 것입니다), 이것을 다루어야 할 또 다른 선택이 있습니까?

말이되지 않으면 알려 주시면 명확히하기 위해 최선을 다하겠습니다.

해결책: 방금 System.Web에 대한 참조를 추가하여 응용 프로그램을 컴파일 할 수있었습니다. 또한 HTTPContext 참조를 "httpcontext.current가 아무것도 아니에요 ..."블록이 웹 애플리케이션으로 실행되지 않으면 코드를 건너 뛸 수 있습니다. 이것이 바로 내가 찾고 있던 것입니다.

도움이 되었습니까?

해결책

Web Assembly를 참조하면 현재 실행중인 Web App의 HTTPContext 객체에 대한 참조 인 httpcontext.current에 액세스해야합니다. 응용 프로그램이 일반 Win32 앱인 경우이 참조는 널 포인터 여야합니다. 따라서 C#에서는 다음을 사용할 것입니다. if (HttpContext.Current == null) 또는 VB에서 사용할 수 있습니다. If HttpContext.Current Is Nothing Then

그러나 나는 이런 종류의 일을 시도한 적이 없으므로 결과를 보장 할 수는 없습니다. 그것이 당신에게 효과가 있는지 알려주세요.

감사합니다, c

다른 팁

앱이 컴파일 되더라도 WinApp에서 HTTPContext가없는 문제가 발생합니다.

httpcontext 대신에 서비스를 사용할 수 있도록 webapp을 리팩터링 할 수 있습니다. icontextservice 또는 다양한 서비스 (icacheservice, isessionservice 등).

서비스에는 두 가지 구현이 있습니다. 하나는 httpcontext를 사용하는 웹 앱과 하나는 WinApp에 대한 구현에 사용자 기본 설정 (언어 등)을 결정하는 데 필요한 논리를 포함 할 수 있습니다.

기본 설정이 서버에 저장된 경우 WinApp과 서버간에 통신하려면 어떤 종류의 서비스를 구현해야합니다.

나는 당신이 약간의 분리를 사용할 수 있다고 생각합니다!

이와 같은 인터페이스를 만들면 (예 : BLL 레이어에서)

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

그리고 당신은 두 가지 구현을 만들었습니다.

귀하의 웹 사이트 프로젝트 :

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

WinForms 프로젝트에서 :

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

이후 당신은 사용합니다 제어의 역전 WebConfig에서 webpefeferredlanguage 인스턴스를 사용해야하고 WinFormspeferredLanguage의 싱글 톤 인스턴스를 WinForms에서 반환해야한다는 것을 구성하려면 (Unity, StructureMap, Microkernel) WebConfig에서 구성해야합니다.

언어를 알아야 할 때마다 코드에서 IOC 컨테이너에 IPRefreRedLanguage의 올바른 구현을 요청하면 구성된 유형의 객체를 반환합니다.

따라서 BLL에서 프로그램을 프로그래밍 할 수 있습니다 (예 : :) :

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

이 글을 작성한 후 VB.NET 솔루션을 원한다는 것을 알 수 있습니다. 글쎄, 예제는 여전히 적용되지만 문법은 약간 다른 문법입니다 (이 방법을 읽기가 더 어려운 경우 죄송합니다).

애플리케이션에 System.Web.dll을 추가 한 다음 httpContext를 사용할 수 있습니다. 문제는 Application에서 HTTPContext가 없으므로 웹 서비스 또는 WCF를 사용하여 두 응용 프로그램간에 통신해야한다는 것입니다.

가능하다면 아마도 당신이 할 수있는 최선의 방법은 공유 어셈블리에서 HTTP- 컨텍스트를 갖는 것에 대한 의존성을 완전히 제거하는 것입니다.

예를 들어, httpcontext를 사용하여 사용자가 선호하는 것을 가져 오기 위해 언급 한 메소드는 언어가 대신 매개 변수로 제공되도록 리팩토링 될 수 있습니다. 웹 애플리케이션에서 메소드를 호출하면 HTTPContext에서 언어로 전달할 수 있으며 Windows 응용 프로그램에서 호출 할 때 다른 소스에서 언어로 전달해야합니다.

당신은 사용해야합니다

Thread.CurrentUICulture

사용자 언어를 결정합니다. Winforms 및 웹 응용 프로그램도 지원됩니다.

.NET 프레임 워크는 대부분의 경우 귀하를 위해 설정했습니다.

프로그램/스레드가 시작될 때 설정할 수 있습니다. 웹 응용 프로그램에서는 application_beginrequest의 Global.asax.cs로 설정할 수 있습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top