>

현재 날짜 (Datetime.Now 사용)를 사용하여 특정 값을 계산하는 응용 프로그램이 있습니다.

다른 날짜를 기준으로 서버에서 이러한 계산을 실행할 수 있어야합니다. 불행히도 두 가지 명백한 선택은 불가능합니다-

a) 정치 및 다른 환경에서도 서비스를 사용한다는 사실로 인해 앱에 대한 코드가 있지만 서비스를 변경하고 특정 날짜를 삽입 할 수 없으며

b) 서버에서 실행중인 다른 응용 프로그램 및 프로세스로 인해 시스템 날짜를 변경할 수 없습니다.

내가 궁금한 것은 :

프레임 워크에 대한 호출을 가로 채고 (이 경우 Datetime.Now) 특정 값을 반환 할 수 있습니까? 이것은 동일한 응용 프로그램에서 제공되거나 그렇지 않을 수 있습니다. 불행히도 이러한 방식으로 이러한 호출을 실제로 가로 챌 수 있는지, 심지어 호출 프로세스를 식별 할 수 있는지 잘 모르겠습니다. 테스트 프레임 워크를 사용하여이 작업을 수행 할 수 있다는 것을 알고 있지만 언제든지 코드베이스를 변경해야합니다.

감사합니다

  • 답변 # 1

    일부 인터넷 검색으로 인해 NirSoft의 RunAsDate 소프트웨어가 소개되었습니다. 이 소프트웨어를 보증 할 수는 없지만 요청한 내용을 정확하게 수행한다고 주장합니다.

    이것이 .NET 애플리케이션에서 작동하는지 알려주십시오!

  • 답변 # 2

    DateTime.Now 를 패치하는 것 외에 다른 방법이 없다면  런타임에-Harmony 라이브러리로이를 수행 할 수 있습니다. 분명히 그런 일은하지 않는 것이 좋지만 스스로 결정할 수 있습니다.

    여기서 이진 파일을 다운로드하십시오 (아직 nuget 패키지는 없습니다). 참조한 다음

    class Program {
        static void Main(string[] args) {
            var now = DateTime.Now; // normal now
            var harmony = HarmonyInstance.Create("test");
            // patch
            harmony.PatchAll(Assembly.GetExecutingAssembly());
            // now + 100 years
            var newNow = DateTime.Now;
        }
        // we are rewriting method get_Now, which is a getter of property Now
        // of type DateTime
        [HarmonyPatch(typeof(DateTime), "get_Now")]
        class Patch {
            // this method runs after original one
            // __result stores value produced by original
            static DateTime Postfix(DateTime __result) {
                // add 100 years to it
                return __result.AddYears(100);
            }
        }
    }
    
    

    DateTime.Now 를 바꿀 것입니다  속성 getter는 런타임시 원래 값 + 100 년을 반환합니다. 필요한 값을 반환하도록 분명히 변경할 수 있습니다.

    이 패치는 다른 프로세스 DateTime.Now 에 영향을 미치지 않습니다  평소처럼 작동합니다.

  • 답변 # 3

    실제로 .net에서하는 것이 더 쉬울 것이라고 생각했지만 결국에는 코드를 변경하기로 결정했습니다. 이 변경이 이상적이지는 않지만 내가 생각할 수있는 문제는 없어야합니다.

    높은 수준-문자열을 가져 와서 datetime을 반환하는 함수와 함께 datetimeprovider 함수를 앱에 추가했습니다. datetime.now 대신 호출됩니다.

    거기에 하나 이상의 환경 이름/연결 문자열 쌍을 포함하는 구성 파일이 있는지 확인합니다. 이미 수신 한 매개 변수를 사용하여 수신 요청을 환경과 일치시키고 일치하는 경우 해당 DB에 연결하여 사용할 날짜를 얻습니다 (QA 환경은 날짜로 이동할 수 있으므로 테이블에 날짜가 저장 됨)

    일치하는 것이 없으면 datetime.now 만 반환합니다

    어쨌든 이것은 언급 한 바와 같이 이상적이지는 않지만 언급 된 다른 솔루션을 통합하는 것보다이 경우에 더 쉽습니다. 또한 언급 한 내용이 솔루션의 범위를 벗어나는 의미가 없을 수도 있으므로 사과드립니다.

    어쨌든 조언을 주셔서 감사합니다. 제가 찾고있는 다른 문제에 대한 아이디어를주었습니다.

  • 이전 ASPNet Core 21 preview1 HTTP 오류 5025 프로세스 실패
  • 다음 list comprehension - 인덱스 검색으로 중첩 된 for 루프 속도를 높이는 방법 PYTHON