2009-06-02 3 views
1

이 사이트의 조언을 기반으로 ASP MVC 응용 프로그램 용 플러그인 솔루션을 작성했지만로드 블록에 도달하여 도움이됩니다. 플러그인 시스템이 어떻게 작동하는지에 대해 깊이 생각하지 않고 컨트롤러를 성공적으로로드하고 적절한 뷰를 찾습니다. 문제는 모든 플러그인 참조를 해결할 수 없기 때문에 뷰가 컴파일되지 않는다는 것입니다 (플러그인 DLL은 다른 호스트 응용 프로그램에서 알 수없는 DLL).ASP MVC 페이지 컴파일 엔진에 대한 참조 추가

CurrentDomain에서 AssemblyResolve를 사용하고 있지만 기본 BuildManager가 뷰를 컴파일 할 때 호출되지 않고 대신 web.config 섹션에서 어셈블리 목록을 가져옵니다. 모든 플러그인 파일을 GAC에 추가하고 해당 섹션에 참조를 추가하면 제대로 작동합니다. 그러나 모든 플러그인에 대해 web.config를 변경해야하는 경우 플러그인 시스템을 사용하는 목적에 위배됩니다.

약간의 그림 문제 설명하기 : Plugin.dll --references -> PluginServices.dll

URL http://mysite.com/some/index MVC 응용 프로그램 --load -> Plugin.dll PASS

MVC 응용 프로그램을 --load -> Plugin.SomeController PASS

MVC 응용 프로그램 --find -> 플러그인 \ 조회수 \ 몇몇 \ Index.aspx PASS

MVC 응용 프로그램 --compile -> Index.aspx FAIL (일 e 뷰에서 찾을 수없는 PluginServices의 유형을 사용함)

web.config를 변경하지 않고 컴파일이 통과하도록 BuildManager에 대한 참조를 동적으로 추가하는 방법이 있습니까?

미리 감사드립니다.

답변

0

다시

C#을 반사 및 동적 메소드 호출, 직접 논리를로드하는 부분은 잘 작동하고 또한 뷰의 위치입니다, 작동하지 않는 유일한 부분은 내가 더이 그 부분입니다 컨트롤 오버 - 페이지의 실제 렌더링입니다.

그러나 나는 그것을 작동시킬 수있었습니다. 내가 한 것은 다음과 같다 : 1) 플러그인 DLL 년대 GAC

2) '편집'아래에있는 DLL의 호스트의 Web.config의에 대한 참조를 추가 등록 섹션이

3) 플러그인의 모든 뷰가 'inherit'속성을 사용하여보기를 강력하게 입력하지 않도록 대신 로컬 변수를 만들고 해당 유형으로 모델을 캐스팅합니다.

이 모든 것이 현재는 정상적으로 작동하는 것으로 보이지만 더 나은 솔루션을 찾을 수 있는지 계속 생각할 것입니다.

다시 말하지만, MVC 용 플러그인 시스템을 어떻게 주장 할 수 있는지 간단하지는 않지만 다음과 같은 라인이있는 간단한 view.aspx를 다루지는 못했습니다 : < % = Model.Name %> 여기서 Model은 객체입니다. 그 주인은 알지.

모든 답변을 주셔서 다시 한번 감사드립니다.

+0

아주 멋진 아이디어 인 것 같습니다. 어떻게 그걸 좋아하지 않아? –

+0

유일한 이유는 GAC에서 파일을 계속 업데이트해야하기 때문에 약간 성가기 때문입니다. 그 외에는 잘 작동하는 것 같습니다. – Gil

0

기본 응용 프로그램에 넣을 수있는 몇 가지 인터페이스 또는 추상 클래스 (인터페이스가 바람직 함)를 만드는 것에 대해 생각해야하므로 플러그인이없는 경우 기본 응용 프로그램은 여전히 ​​컴파일됩니다. 그런 다음 플러그인의 인터페이스 또는 기본 클래스에 대한 구현을 작성합니다.

This article 당신을 시작할 수 있습니다.

+0

답장을 보내 주셔서 감사합니다. 그러나 ASP가 실제로 페이지를 렌더링하고 참조를 확인하려고 할 때 문제가 발생하기 때문에 실제로 작동하지 않습니다. 관련 DLL을 찾을 수 없습니다. – Gil

+0

플러그인의 인터페이스 구현을 사용할 수없는 경우 (스텁 또는 단위 테스트 모크 일지라도) 어떻게 응용 프로그램을 실행할 수 있습니까? –

+0

구현은 런타임에 플러그인에 전달되는 다른 어셈블리입니다. 플러그인은 사용중인 객체의 인터페이스와 런타임에 실제 객체가있는 서비스 계층 잠김에 대해서만 알고 있습니다. 문제는 호스트 응용 프로그램이 플러그인의보기를 렌더링 할 때 인터페이스 이름을 확인할 수 없다는 것입니다. – Gil

0

당신은 호스트 dll을 컴파일하는 호스트 프로젝트를 원하지 않는다고 생각합니다. 미리 작성한 플러그인을 가지고 어셈블리 dll에 뷰를 임베드하고 싶다고 생각합니다.이 방법을 사용하면 적절한 인터페이스 [Robert Harvey et al]를 만들 수 있으며 호스트 응용 프로그램이 동적으로로드 된 어셈블리는 괜찮아. 아마도 당신은 또한 (단위?) 플러그인 개발/컴파일로 테스트 플러그인 하네스 솔루션을 만들 필요가 있습니다 -보기에 일부 컴파일 오류가 즉시 나타나지 않아야합니다 (this post 또한 뷰에서 컴파일러 오류와 도움이되어야합니다 - 그것은 나를 위해 일했다).

+0

이것은 유망 해 보이지만 어느 쪽도 효과가 있습니다. 모든 미리보기를 미리 컴파일하고 호스트와 동일한 폴더에 있는지 확인했지만 여전히 참조를 확인할 수는 없었습니다. ASP MVC 용 플러그인 디자인을 가지고 있다고 주장하는 게시물이 많이 있지만 호스트에 알려지지 않은 비즈니스 계층에 대한 참조가있는 실제보기와 함께 작동하는 것을 아직 보지 못했습니다. 신청. – Gil

0

길,

는 다음 문서에서보세요. Reflection을 사용하여 런타임시 비즈니스 계층 어셈블리에 대한 정보를 얻은 다음 InvokeMember를 사용하여 원하는 메서드를 호출하는 방법에 대해 설명합니다. 어떤 종류의 등록이 필요하지 않습니다. 어셈블리 경로 만 있으면됩니다.
http://my.execpc.com/~gopalan/dotnet/reflection.html