2014-03-31 2 views
6

asp.net webforms 응용 프로그램이 있습니다. 모든 단일 aspx.cs 클래스는 System.Web.UI.Page에서 상속받은 BasePage.cs에서 상속해야합니다.클래스에 잘못된 상속이있을 때 예외를 throw하는 방법

원하는 페이지의 Inheritance : 나는 새 하위 페이지가 생성 될 때이 BasePage.cs에서 상속과는 System.Web.UI.Page하지 않는 것이 강제로 어떻게

class MyChildPage : BasePage : System.Web.UI.Page 

?

잠재적 인 솔루션 :

  • aspx.cs 페이지의 기본 생성을 변경할 수있는 방법이 있나요?
  • System.Web.UI.Page에서 상속되면 컴파일러 오류가 발생합니다.

참고 : 이러한 하위 페이지는 동일한 마스터 페이지를 공유하므로 도움이됩니다.

+0

[** FxCop **] (http://msdn.microsoft.com/en-us/library/bb429476(v=80) .aspx)와 같은 도구를 사용해 보셨습니까? 또한 모든 페이지가'BasePage'를 확장하는지 확인하기 위해 사용자 정의 빌드 단계를 가질 수 있습니다. – mellamokb

답변

1

모든 페이지의 유효성을 검사하는 사용자 지정 MSBuild 작업으로이를 구현할 수 있습니다. 예를 들어 BasePagePage에서 상속 받음을 확인하는 Task입니다. 다른 클래스는 Page에서 상속하는 경우, 오류가 출력에 기록되고 빌드가 실패합니다

public class CheckBasePage : Task 
{ 
    public override bool Execute() 
    { 
     var assm = Assembly.LoadFile("/path/to/WebsiteAssembly.dll"); 
     var types = assm.GetTypes(); 

     var pages = new List<string>(); 
     foreach (var t in types) 
     { 
      if (t.BaseType == typeof(Page) && t.Name != "BasePage") 
      { 
       pages.Add(t.FullName); 
      } 
     } 

     if (pages.Count > 0) 
     { 
      Log.LogError("The following pages need to inherit from BasePage: [" + string.Join(",", pages) + "]"); 
      return false; 
     } 

     return true; 
    } 
} 

그런 다음 프로젝트 파일의 빌드 프로세스의 일환으로 사용자 지정 작업을 추가합니다 :

<UsingTask TaskName="CheckBasePage" AssemblyFile="/path/to/MyCustomTasksAssembly.dll" /> 

<Target Name="PostBuild"> 
    <CheckBasePage /> 
</Target> 

이제는 MyCustomTasksAssembly이 이와 같이 사용자 지정 MSBuild 작업을 관리하기 위해 만드는 별도의 프로젝트라고 가정합니다. CheckBasePage 작업을 나머지 코드와 동일한 프로젝트에 포함 시키려면 same trick from here을 적용해야합니다.

+0

이로 인해 문제가 발생합니다.어셈블리가로드되면 어셈블리를 언로드하지 않습니다. 이는 CheckBasePage 작업에서 사용되기 때문에 어셈블리를 bin 디렉토리로 이동할 수 없기 때문에 빌드 프로세스를 중단시킵니다. 다른 응용 프로그램 도메인 (http://msdn.microsoft.com/en-us/library/ms173101.aspx)에서 어셈블리를로드하는 작업을 시도했지만 언로드 할 수 있었지만 파일을 열려고 시도 할 때 예외가 발견되지 않았습니다. . 어떤 아이디어? – Rafi

+0

예, 마지막 단락을 읽었습니까? 나는 이것을 직접 시험하고 그것을 작동시킬 수 있었다. – mellamokb

+0

네, 고마워요. 나는 같은 어셈블리에서 그것을하고 싶었다. 문제는 하나의 appDomain 내에서 복잡한 객체를 전달할 수 없다는 것입니다 (유형). 따라서 코드를 일반 오브젝트 만 전달하면됩니다. – Rafi

5

확실하지가 상황에 맞는하지만 web.config-

를 통해 전체 응용 프로그램에 대한 MSDN의
<system.web> 
    <pages pageBaseType="BasePage" /> 
</system.web> 

문서 기본 페이지를 지정할 수있는 경우 : 켈리의 대답에 대한 대안으로 http://msdn.microsoft.com/en-us/library/950xf363(v=vs.85).aspx

+0

@ [Kelly Gendron] 실제로 작동하지 않습니다. 이는 코드가없는 독립 실행 형 페이지에서만 작동합니다. 자세한 내용은 답변 및 http://www.velocityreviews.com/forums/t602134-pagebasetype-attribute-in-pages-element.html의 문서를 참조하십시오. – Rafi

0

을, 구성을보다 유연하지만 고통의 더 인이 작업을 수행 할 수 있습니다

class MyChildPage : BasePage 

와 ...

System.Web.UI.Page에서 상속 BasePage에서
class BasePage : System.Web.UI.Page 

그래서 MyChildPage 상속.

+0

이것은 이미 내가하고있는 일이다. 제 질문은 앞으로 어떻게 새로운 페이지를 만들 때 잊어 버리거나 새로운 개발자가 팀에 합류하더라도이 방법으로 유지할 수 있는지 확인하는 것입니다. – Rafi