有什麼方法可以使用Spring.NET將依賴關係注入到Immediacy CMS控件中,理想情況下在初始化控件時無需使用ContextRegistry
?Spring.NET和Immediacy CMS
回答
我打算用Immediacy 6.x使用了一年多的解決方案來回答這個問題。理論上,這應該與Alterian CMC 7.x(Immediacy的繼任者)進行一些修改。
這裏的問題是Immediacy已經在web.config中定義了一個處理所有aspx頁面的處理函數。不過,我發現這可以用web.config中的Spring.NET的PageHandlerFactory
條目取代,就像大多數webforms應用程序一樣!
但是,一些調整仍然需要,因爲開箱即用,預覽器仍然存在問題。爲獲得Spring.NET用一個即時性的控制發揮很好的過程是:
添加常用的條目爲web.config中Spring.NET as outlined in the documentation。在這種情況下,我已經在Spring.config中獲得了對象定義。
創建以下抽象基類,將處理所有的依賴注入工作:
SpringImmediacyControl.cs
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); } }
這類似於the code for server side controls over on the Spring.NET documentation。但是,需要額外的
OnInit
&空檢查代碼是因爲預覽器在Immediacy自己的預覽程序HTTP處理程序下呈現該控件。這意味着需要手動調用Spring.NET的上下文註冊表來注入依賴關係。對於您希望與控制容器的Spring.NET的反演用,relelvant條目添加到Spring.config,例如任何控制:
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>
如果所有的工作都正確完成,您將擁有寫出「Spring.NET的Hello world!」的控制權。當在頁面中使用時。
All of the code I've used can be downloaded & forked from here.
順便說一句,這個過程是類似的,如果你想創建的ButtonPluginConfig
Spring.NET兼容的子類,除了這些子類是總是下即時性自己的HTTP處理程序執行的控制配置,因此調用Spring.NET的上下文註冊表總是需要的。我在上面的要點中也包含了一個從ButtonPluginConfig
派生的抽象類。
作爲一名前Immediacy員工,我以前一直都在看這類問題。
認爲即時性是一種標準的.net Web應用程序,位於框架之上。 他們簡單地擴展了基類,例如Page類,並添加了一些全局有用的對象。
Immediacy確實擁有自己的控件等基類,但沒有什麼能阻止您基於標準.NET類創建自己的控件。
我已經看到了一個技巧,你需要做某些可能會破壞即時性功能的特定功能,那就是創建一個子應用程序,然後在添加到主應用程序的自定義控件中調用它的頁面。
這樣,您的子應用程序就可以做到它喜歡的功能,而不會破壞任何內容和父親即時性應用程序,只需從該應用程序讀取流。
在其最簡單的形式,關鍵是要簡單地創建做一件事情的控制......
WebClient wc = new WebClient();
this.Controls.Add(Page.ParseControl(wc.DownloadString("/childapp/yourcustomthing.aspx")));
最乾淨的另一種方式做,這是實現所需的子組件從一個ASHX處理程序是什麼我見過。
可能會出現的唯一問題是您失去了子應用程序中對象的即時性框架,但您可以輕鬆地通過querystrings傳遞一些關鍵信息,然後構建您自己的「依賴緩存」,其中包含您需要的內容。
這不是我所知道的理想,但即時性確實有一個習慣,當你需要做任何事情時,除了在列表/類似的插件頁面或模板中進行任何操作之外,還會有生活困難的習慣。
- 1. ASP.NET MVC和Spring.NET
- 2. Spring.Net IoC和Magic Strings
- 3. Spring.net和Oracle Coherence集成
- 4. ASP.NET MVC與Spring.NET和ModelBinder
- 5. Spring.NET和單聲道集成
- 6. spring.net和WCF Rest服務
- 7. Spring.Net和屬性注入
- 8. 對Spring.NET
- 9. 從spring.net
- 10. Spring.net + NHibernate + .net MVC:Spring.Objects.Factory.UnsatisfiedDependencyException
- 11. Spring.Net + Nhibernate配置
- 12. 如何在Spring.NET
- 13. spring.net驗證
- 14. Spring.NET,Quartz&Transactions
- 15. 如何Spring.Net
- 16. ASP.net MVC3&Spring.net
- 17. Programmical「Spring.Net」配置
- 18. Spring.Net HibernateTemplate.Execute澄清
- 19. Django-cms和autoblocks
- 20. Codeigniter HMVC和CMS
- 21. Flex Builder和CMS?
- 22. Bolt cms和Ckeditor
- 23. ASP.NET ROUTES和CMS
- 24. Visual Studio和CMS?
- 25. django-cms和jQuery
- 26. Orchard CMS和javascript:Number.parseInvariant
- 27. Castle Windsor或Spring.NET - 優點和缺點
- 28. 使用NHibernate和Spring.Net實現存儲庫
- 29. Spring.net和protobuf:對象實例化
- 30. Spring.Net Quartz調度和代碼配置
感謝您的回答 - 從前Immediacy員工獲得洞察力總是非常有趣。如果我無法使Spring.NET與Immediacy合作,無論是作爲MVC應用程序還是Spring.NET處理的aspx,子應用程序方法正是我所要做的。我已經開始着手將Spring.NET集成到Immediacy應用程序和我描述的方法中,即使使用NHibernate和OpenSessionInView也不會中斷Immediacy!順便說一下,我們甚至使用Spark製作控件模板並在ASP.NET MVC上放置非即時性的東西 - 所有有趣的東西! – 2010-05-24 16:14:57
聽起來有趣,我可能可以提供一個類似的解決方案給你發現自己,但沒有與Spring.Net速度加快我不想給錯誤的建議。即時性通常是非常靈活的,另一個想法可能是放在你自己的處理程序中,並且在那個調用中,即時性以及運行你自己的代碼......儘管這可能是相當嚴重的代碼。它正在慢慢變得越來越像共享點......這麼大以至於人們害怕走近它,看到人們承擔這樣的任務是一個令人耳目一新的變化。 – War 2010-05-26 16:08:28