ASP.NET Web Froms 개발 모델 에서 프로그램 집합 지연 로드 실현

6229 단어 asp.net
로드 지연 은 매우 큰 유혹 으로 비교적 좋 은 효 과 를 얻 을 수 있다.예 를 들 어:
1.실체 구조 에서 관련 데이터 의 수량 과 사용 시기 가 불확실 하기 때문에 로드 지연 을 통 해 사용 할 때 만 관련 데이터 의 조회 작업 을 수행 하고 불필요 한 데이터 조회 작업 을 줄 이면 단일 데이터 조회 가 실 행 된 시간 을 낮 추고 시스템 의 성능 을 향상 시 킬 수 있다.
2.한 플러그 인 플랫폼 에서 플랫폼 을 시작 할 때 필요 한 프로그램 집합 만 불 러 옵 니 다.구체 적 인 플러그 인 을 실행 할 때 플러그 인 관련 프로그램 집합 을 불 러 옵 니 다.필요 할 때 만 자원 을 불 러 옵 니 다.플러그 인 플랫폼 의 시작 시간 을 줄 이 고 메모리 의 사용 을 합 리 적 으로 할 수 있 습 니 다.
로드 지연 은 자원 의 점용 을 더욱 합 리 적 으로 하고 일정한 성능 을 향상 시 킬 수 있다.물론 로드 지연 의 나 쁜 점 을 설명 하 는 사례 도 있다.이것 은 실제 상황 에 따라 고려 해 야 한다.이 글 의 목적 이 아니다.
 
다시 말 하면 ASP.NET Web Forms 개발 모델 에서 프로그램 집합 은 보통 bin 디 렉 터 리 에 놓 이거 나 웹 config 에서 codebase 나 probing 노드 를 설정 하여 프로그램 집합 디 렉 터 리 를 지정 합 니 다.프로그램 이 시 작 될 때 이 위치 에서 프로그램 집합 을 자동 으로 불 러 옵 니 다.지연 로 딩 을 사용 하려 면 프로그램 집합 을 이 곳 에 두 면 안 됩 니 다.로 딩 지연 이 필요 한 프로그램 집합 을 규칙 적 인 디 렉 터 리 에 두 는 것 이 좋 습 니 다.예 를 들 면:
root
|–bin
|–lazyload
|    |–bin1
|    |–bin2
이 프로그램 집합 을 하나의 lazyload 디 렉 터 리 에 넣 은 다음 프로그램 집합 에 따라 하위 디 렉 터 리 를 만 들 고 필요 에 따라 디 렉 터 리 에 프로그램 집합 을 불 러 옵 니 다.
 
그럼 어떤 방법 으로 프로그램 집합 을 불 러 올 까요?
Assembly 류 는 몇 가지 정적 방법 을 제공 합 니 다.Load,LoadFile,LoadFrom 는 이 몇 가지 방법 을 통 해 dll 파일 을 현재 응용 프로그램 도 메 인 에 불 러 올 수 있 습 니 다.
이 몇 가지 방법 을 어떻게 선택 하 는 지 에 대해 인터넷 상에 서 약간의 총 결 이 있 는데,여 기 는 토론 하지 않 는 다.다음은 몇 가지 총결산 이다.
http://www.cnblogs.com/xuqingfeng/archive/2012/05/22/assembly-load-loadfrom-loadfile-details.html
http://msdn.microsoft.com/zh-cn/library/dd153782(v=vs.110).aspx
 
프로그램 집합 지연 로드 를 실현 하려 면 두 곳 을 확장 해 야 합 니 다.
1.프로그램 집합 에 의존 하 는 지연 로드
현재 응용 프로그램 도 메 인AssemblyResolve이 벤트 를 구독 함으로써 응용 프로그램 도 메 인 은 의존 프로그램 집합 을 불 러 올 때 찾 지 못 하면 이 이 벤트 를 촉발 합 니 다.
이 이벤트 에서 불 러 올 프로그램 집합 파일 을 규칙 적 으로 찾 은 다음 Assembly 로 딩 방법 으로 메모리 에 불 러 오고 되 돌 릴 수 있 습 니 다.AppDomain.CurrentDomain.AssemblyResolve += CurrentDomain_AssemblyResolve;
  private   Assembly CurrentDomain_AssemblyResolve( object   sender, ResolveEventArgs args) { Assembly assembly =  null ;
  //
  return   assembly; }
2.페이지 동적 컴 파일 에 필요 한 프로그램 집합 지연 로드
aspx 페이지 는 처음 방문 할 때 컴 파일 되 며,컴 파일 할 때 페이지 가 연 결 된 클래스 가 있 는 프로그램 집합 이 필요 합 니 다.기본적으로 이 프로그램 집합 은 프로그램 이 시 작 될 때 자동 으로 불 러 옵 니 다..net 4 부터 마이크로소프트 는 프로그램 이 시 작 된 확장 지원System.Web.PreApplicationStartMethod을 제공 합 니 다.여기 서 프로그램 을 통 해 프로그램 집합 을 불 러 올 수도 있 지만 불 러 오 는 지연 효 과 는 없습니다.
aspx 페이지 의 컴 파일 은BuildManager을 통 해 이 루어 집 니 다.호출BuildManager.AddReferencedAssembly방법 은 프로그램 집합 을 추가 할 수 있 습 니 다.그러나 이 방법 은 위 에서 언급 한 확장 지원 에서 만 호출 될 수 있 습 니 다.프로그램 이 시 작 된 후에 호출 하면 이상 이 발생 합 니 다(.net 4.0 이 아직 조율 되 지 않 은 것 일 수 있 습 니 다).이 길 은 통 하지 않 습 니 다.방법 을 통 해 추가 할 수 없 으 니 BuildManager 의 프로그램 집합 에 직접 가입 할 수 있 습 니까?불행 하 게 도 모두 개인 적 이 고 관심 있 는 것 은 스스로 역 컴 파일 할 수 있 습 니 다.
개인 적 인 것 도 얻 을 수 없 는 것 이 아니 라 반 사 를 사용 할 수 있 습 니 다.다행히 BuildManager 는 정적 속성 인 The BuildManager 가 있 습 니 다.반 사 를 통 해 이 속성의 값 을 얻 으 면 내부 의 BuildManager 인 스 턴 스 를 얻 을 수 있 습 니 다.프로그램 집합 을 수정 하 는 것 은 문제 가 되 지 않 습 니 다.// BuildManager PropertyInfo buildmanagerProperty = Type.GetTypeFromHandle( typeof (BuildManager).TypeHandle).GetProperty( "TheBuildManager" , BindingFlags.Static | BindingFlags.NonPublic | BindingFlags.GetProperty); BuildManager buildmanager = buildmanagerProperty.GetValue( null null as   BuildManager;
  // TopLevelReferencedAssemblies PropertyInfo topLevelReferencedAssembliesProperty = Type.GetTypeFromHandle( typeof (BuildManager).TypeHandle).GetProperty( "TopLevelReferencedAssemblies" , BindingFlags.Instance | BindingFlags.NonPublic | BindingFlags.GetProperty); IList assemblies = topLevelReferencedAssembliesProperty.GetValue(buildmanager,  null as IList;
  // Assembly assembly =  null ;
  //
  assemblies.Add(assembly);
이 프로그램 은 페이지 를 컴 파일 하기 전에 호출 해 야 합 니 다.예 를 들 어PageHandlerFactory의 GetHandler 방법 에서.
 
이 두 확장 을 통 해 기본적으로 프로그램 집합의 지연 마 운 트 를 실현 할 수 있 으 며,무엇 을 할 수 있 는 지 는 자신 에 게 달 려 있다.블 로그 원 에서 어떤 사람 이OSGI.NET을 만 들 었 는데 글 속 의 두 가지 방법 을 사용 했다.
물론 위 에 서 는 문 제 를 해결 하 는 방법 을 초보 적 으로 제 시 했 을 뿐 실제 적 으로 사용 하려 면 더 많은 문 제 를 고려 해 야 할 것 이다.예 를 들 어 다 중 스 레 드 동기 화 문제,프로그램 집합 다 중 버 전 문제 등 관심 이 있 는 것 은 쓸 수 있다.
 
본인 독립 블 로그 주소:http://blog.bossma.cn/dotnet/asp-net-how-to-lazy-load-assembly/
전재 출처 를 밝 혀 주 십시오.

좋은 웹페이지 즐겨찾기