프로젝트에서 기존 100개 이상의 DLL 3을 호출하여 단일 유형의 도메인 간 문제 해결

15173 단어 dll
같은 유형의 작업 Wrap을 다음 코드와 같이 같은 유형으로 만듭니다.

  
  
/// <summary>
/// really business operation.
/// </summary>
[Serializable]
public class ServiceWrapper1 : MarshalByRefObject
{
protected ServiceWrapper1()
{
}

public virtual List < OpaOutput > GetUserDto(OpaInput input)
{

Console.WriteLine(AppDomain.CurrentDomain.FriendlyName
+ " Test2 " ); // show current domain
OPATest test = new OPATest();
return test.GetUserDto(input);
}
}
}

이것은 간단한 wrap으로 다른 dll의OPAtest 클래스를 호출하는 데 사용되며, 코드가 독립된 영역에서 실행되는지 테스트합니다
구조 함수가Protected로 변하는 주요 원인은 구조 함수를 통해 wrap 실례를 직접 만드는 것을 금지하고,DefaultInstance를 통해 코드를 호출하도록 강요하기 때문이다. (이것이야말로 응용 프로그램의 격리이다)
Private가 되지 않는 이유는 나중에 계승이 필요하기 때문입니다. 부류의 구조 함수를private로 설정하면 부류도 구성할 수 없습니다.
그러나 현재 코드에서 보호된 코드를 퍼블릭으로 바꿔야 정상적으로 실행할 수 있습니다.
도메인 간 문제를 해결하기 위해 Wrap 클래스를 MarshalByRefObject에 상속합니다.
OpaInput과 OpaOutput은 각각 입력 출력 매개 변수(기존 dll에서 개발을 편리하게 하기 위해 일시적으로 서열화할 수 있고 진정한 서열화가 실현되는 문제는 잠시 후에 해결됨) 다음은 그들의 정의이다.

  
  
namespace ClassLibrary2
{

public class OPATest
{
public List < OpaOutput > GetUserDto(OpaInput input)
{
return new List < OpaOutput > {
new OpaOutput() { Date = DateTime.Now },
new OpaOutput(){Date = DateTime.Now},
new OpaOutput(){Date = DateTime.Now},
};
}
}
[Serializable]
public class OpaOutput
{
public string Name { get ; set ; }
public string Content;
public int Type;
public DateTime Date { get ; set ; }
}
[Serializable]
public class OpaInput
{
public string UserCode { get ; set ; }
public string Content;
public int ? Type;
public DateTime StartDate { get ; set ; }
public DateTime EndDate { get ; set ; }
}
}

전역에 쉽게 접근할 수 있는 dll은 다음과 같은 유형을 실현했다

  
  
[Serializable]
public class BaseWrapper < T > : MarshalByRefObject
{
/// <summary>
/// define a application domain for every T
/// </summary>
private static AppDomain _CurrentDomian = null ;

/// <summary>
/// static constructor
/// </summary>
static BaseWrapper()
{
string domainName = " Application Execution Domain " + typeof (T).FullName;
_CurrentDomian
= AppDomain.CreateDomain(domainName, null , null );
}

/// <summary>
/// forbid call constructor directly.
/// </summary>
protected BaseWrapper()
{
}

/// <summary>
/// singleton instance.
/// </summary>
public static T DefaultInstance
{
get
{
return (T)_CurrentDomian.CreateInstanceAndUnwrap( typeof (T).Assembly.FullName, typeof (T).FullName);
}
}

}

그러면 크로스 도메인 호출은 매우 간단하고, 하나의 유형 T에 대한 Application Domain을 유지합니다.
호출 코드는 다음과 같습니다.

  
  
BaseWrapper < ServiceWrapper1 > .DefaultInstance.GetUserDto( new ClassLibrary2.OpaInput() { Content = " 123 " });

매우 간단하다. 원래의 호출 코드에 비해 증가한 코드량은 조금도 많지 않다. 원래의 호출 코드는 다음과 같다.

  
  
ServiceWrapper1 s = new ServiceWrapper1();
s.GetUserDto(
new ClassLibrary2.OpaInput() { Content = " 123 " });

최종 실행 결과는 다음과 같습니다.
Application Execution Domain ClassLibrary1.ServiceWrapper1 Test2
이 방법은 새로운 응용 프로그램 영역에서 실행된다는 것을 설명합니다
PS: 입력과 출력을 서열화하는 가설을 만들었습니다. 사실 모든 사람들이 코드를 설명할 때 서열화 탭을 붙이는 것은 아닙니다. 잠시 후에 저희가 이 문제를 해결하겠습니다.
그러면 지금까지 외부 dll을 호출한 모든 코드를 분류에 집중하고 서로 다른 응용 프로그램 영역에서 격리하여 실행했습니다

좋은 웹페이지 즐겨찾기