2010-01-04 3 views
3

컨트롤을 초기화 할 때 ContextRegistry을 사용하지 않고도 Spring.NET을 사용하여 Immediacy CMS 컨트롤에 종속성을 주입 할 수있는 방법이 있습니까?Spring.NET & Immediacy CMS

답변

0

저는 Immediacy 6.x로 1 년 넘게 사용해온 해결책으로이 문제에 대답 할 것입니다. 이론 상으로는 Alterian CMC 7.x (Immediacy의 후계자)와 약간의 수정이 필요합니다.

Immediacy에는 이미 모든 aspx 페이지를 처리하는 web.config에 정의 된 처리기가 있습니다. 그러나, 대부분의 webforms 어플리케이션에 따라 web.config에서 Spring.NET의 PageHandlerFactory에 대한 항목으로 바꿀 수 있다는 것을 알았습니다!

하지만 아직까지는 프리뷰자와 관련하여 문제가 있습니다. 직접 제어 멋지게 연주 Spring.NET를 얻기위한 프로세스는 다음과 같습니다

  1. 은 Spring.NET as outlined in the documentation에 대한 Web.config의에 일반적인 항목을 추가합니다. 이 경우 Spring.config에 객체 정의가 있습니다.

  2. 는 의존성 삽입 모든 작업을 처리 할 다음과 같은 추상 기본 클래스 만들기 :이 the code for server side controls over on the Spring.NET documentation 유사하다

    public abstract class SpringImmediacyControl : ImmediacyControl, ISupportsWebDependencyInjection 
    { 
        // You can do the same thing for other control classes, like LiteralControl 
    
        #region ISupportsWebDependencyInjection Members 
    
        public IApplicationContext DefaultApplicationContext 
        { 
         get; 
         set; 
        } 
    
        #endregion 
    
        protected override void OnInit(EventArgs e) 
        { 
         // Required for page preview, which is executed using Immediacy's page preview handler 
    
         if (DefaultApplicationContext == null) 
         { 
          DefaultApplicationContext = ContextRegistry.GetContext() as WebApplicationContext; 
          DefaultApplicationContext.ConfigureObject(this, this.GetType().FullName); 
         } 
    
         base.OnInit(e); 
        } 
    
        protected override void AddedControl(Control control, int index) 
        { 
         this.EnableViewState = false; 
    
         // Handle DI for children ourselves - defaults to a call to InjectDependenciesRecursive 
    
         if (DefaultApplicationContext != null) 
          WebDependencyInjectionUtils.InjectDependenciesRecursive(DefaultApplicationContext, control); 
    
         base.AddedControl(control, index); 
        } 
    } 
    

    SpringImmediacyControl.cs.그러나 미리보기 프로그램이 직접 작성자의 미리보기 HTTP 처리기에서 컨트롤을 렌더링하기 때문에 추가 OnInit & null 확인 코드가 필요합니다. 즉, Spring.NET의 컨텍스트 레지스트리를 수동으로 호출해야 의존성을 주입 할 수 있습니다. 당신이 컨트롤 컨테이너의 Spring.NET의 반전과 사용 예를 들어, Spring.config에 relelvant 항목을 추가하고자하는 어떤 제어를 위해

  3. :

    SampleControl.cs을

    public class SampleControl : SpringImmediacyControl, INamingContainer 
    { 
        public string Text 
        { 
         get; 
         set; 
        } 
    
        protected string InjectedText 
        { 
         get; 
         set; 
        } 
    
        public SampleControl() 
         : base() 
        { 
         Text = "Hello world"; 
        } 
    
        protected override void RenderContents(HtmlTextWriter output) 
        { 
         output.Write(string.Format("{0} {1}", Text, InjectedText)); 
        } 
    } 
    

    Spring.config

    <objects xmlns="http://www.springframework.net"> 
        <object type="MyProject.SampleControl, MyAssembly" abstract="true"> 
         <property name="InjectedText" value="from Spring.NET" /> 
        </object> 
    </objects> 
    
  4. 모든 것이 올바르게 수행 되었다면, Spring.NET에서 "Hello world!"라고 쓰는 컨트롤을 갖게 될 것입니다. 한 페이지에서 사용될 때. 당신이 ButtonPluginConfig의 Spring.NET 호환 서브 클래스를 생성하고자하는 경우 이러한 서브 클래스 항상 제어 구성을 위해 직접 자신의 HTTP 처리기에서 실행됩니다 제외하고로

All of the code I've used can be downloaded & forked from here.

옆으로, 과정은 비슷합니다 & 그래서 Spring.NET의 컨텍스트 레지스트리 호출은 항상 필요하다. 위의 요지에는 ButtonPluginConfig에서 파생 된 추상 클래스도 포함되었습니다.

1

예를 들어 직접 직원 인 저는 항상 이런 종류의 문제를 보았습니다.

immediacy는 프레임 워크 상단에있는 표준 .net 웹 앱으로 생각하십시오. 그들은 단순히 Page 클래스와 같은 것들에 대한 기본 클래스를 확장하고 일부 전역 적으로 유용한 객체를 추가했습니다.

Immediacy에는 컨트롤에 대한 자체 기본 클래스가 있지만 표준 .net 클래스를 기반으로 컨트롤을 만드는 것을 막을 수있는 방법은 없습니다.

즉각적인 기능을 손상시킬 수있는 특정 작업을 수행해야하는 경우를 보았습니다. 하위 응용 프로그램을 만든 다음 기본 응용 프로그램에 추가하는 사용자 지정 컨트롤 내에서 페이지를 호출하는 방법입니다.

이 방법으로 자녀의 앱은 부모님이 직접 앱을 깨지 않고도 좋아하는 것을 할 수 있으며 해당 앱에서 스트림을 읽습니다. 간단한에서

트릭을 형성은 단순히 한 가지를 수행하는 제어 ...

WebClient wc = new WebClient(); 
this.Controls.Add(Page.ParseControl(wc.DownloadString("/childapp/yourcustomthing.aspx"))); 

이 작업을 수행 할 수있는 깨끗한 다른 방법에서 ASHX 처리기으로 필요한 하위 구성 요소를 구현하는 것입니다을 만드는 것입니다 무엇을 나는 본 적이.

유일한 문제는 자식 응용 프로그램에서 개체의 즉각적인 프레임 워크를 잃어 버릴 수 있지만 쿼리 문자열을 통해 핵심 정보를 쉽게 전달한 다음 필요한 정보가 포함 된 자신의 "depency 캐시"를 쉽게 만들 수 있다는 것입니다 .

내가 아는 이상적인 것은 아니지만 직접 또는 유사한 플러그인을 페이지 또는 템플릿에 떨어 뜨릴 때 이상을해야 할 때 즉시성이 부족한 습관이 있습니다.

+0

답변 해 주셔서 감사합니다. 전직 임직원의 통찰력을 얻으려면 항상 흥미 롭습니다. 자식 응용 프로그램 접근 방식은 Spring.NET에서 Immediateacy로 작업 할 수 없다면 할 수있는 일입니다. 하나는 MVC 응용 프로그램이거나 Spring.NET에서 처리하는 aspx입니다. 나는 Spring.NET을 Immediacy 어플리케이션과 통합하는 작업을 이미 시작했다. NHibernate와 OpenSessionInView를 사용해도 이미 설명한 접근 방식을 사용할 수있다. 즉, Immediateacy를 깨지는 않는다. 제쳐두고 우리는 Spark을 사용하여 컨트롤 템플릿을 만들고 심지어 ASP.NET MVC에 비 직접적인 것들을 넣기까지했습니다 - 모든 재미있는 것들! –

+0

흥미로웠다. 아마도 내가 발견 한 것과 비슷한 해결책을 제공했을 지 모르지만, Spring.Net과 속도를 맞추지는 않았다. 나는 잘못된 조언을하고 싶지 않았다. 직접성은 일반적으로 매우 유연합니다. 또 다른 아이디어는 자신의 처리기에 넣는 것이었을 수 있습니다. 즉, 직접 코드를 실행하는 것뿐만 아니라 즉시 코드를 실행하는 것이 었습니다 ... 코드가 꽤 무거웠습니다. 그것은 점점 더 셰어 포인트와 같이 점점 더 커지고 있습니다 ... 사람들이 가까이에 가면 무서워서 사람들이 그런 작업을하는 것을 보는 것은 상쾌한 변화입니다. – War