考慮這個抽象類如何注入到所有子對象自動
public abstract class Foo
{
public Injectable Prop {get;set;}
}
我有我想提高,同時重構爲了簡單的應用程序。 我有超過100個類調用一些相同的東西(例如類Injectable
),我認爲這種行爲可以抽象並設置爲一個基類,每個人都會從這個基類繼承,以刪除複製/粘貼代碼。
但是,我想避免在彈簧配置文件中複製/粘貼代碼,方法是定義一個Injectable
對象,然後定義從Foo
繼承的子對象foreach和每個類。
我正在尋找一種方法來設置抽象類的屬性,然後通過配置自動獲取它們的所有子元素。我想避免讓抽象類是這樣的:
public abstract class Foo
{
public Injectable Prop
{
get { return (Injectable)ContextRegistry.GetContext()["Injectable"]; }
}
}
感謝您的任何建議
編輯: 以使事情更復雜的子類是ASP.NET頁面,所以我有限控制它們是如何生成的。
當前我正在使用上面提到的代碼,其中抽象類使用Id「Injectable」來引用DI創建的對象。我想避免飛串
UPDATE(帶解決方案)
考慮: 類
public abstract class BasePage : System.Web.UI.Page
{
public IInjectable FooProp {get;set;}
}
public abstract class BaseControl : System.Web.UI.UserControl
{
public IInjectable FooProp {get;set;}
}
public partial class ChildPage : BasePage
{
protected void Page_Load(object sender, EventArgs e)
{
FooProp.DoSomeThing();
}
}
public partial class ChildControl : BaseControl
{
protected void Page_Load(object sender, EventArgs e)
{
FooProp.DoSomeThing();
}
}
春天CFG ...
<object id="Injectable" type="ConcreteInjectable">
<property name="SomeProp" value="Injected!!" />
</object>
<!--The requirement is to declare something like:-->
<object type="BasePage" abstract="true">
<property name="FooProp" ref="Injectable />
</object>
<!--it works for usercontrols too-->
<object type="BaseControl" abstract="true">
<property name="FooProp" ref="Injectable />
</object>
和效果將爲每個的繼承者將有FooProp
屬性注入我配置的內容。
它無關緊要,如果這可以通過某種約定結合來實現,但我不希望從我的代碼中使用的字符串和使用DI引用。
月2日更新和解決方案 感謝tobsen和Erich Eichinger發現該溶液: 首先,這不是原生支持,但解決的辦法也不是很醜陋的,也沒有一個壞的方式打破DI模式規範
現在,以上所有(在更新) 埃裏希的解決方案,這是給需要Spring的配置,使一個IHttpModule
像這樣:
public class PageModuleInjecter : IHttpModule
{
public void Dispose() {}
public void Init(HttpApplication context) {
context.PreRequestHandlerExecute += context_PreRequestHandlerExecute;
}
void context_PreRequestHandlerExecute(object sender, EventArgs e) {
IHttpHandler handler = ((HttpApplication)sender).Context.Handler;
if (handler is BasePage)
Spring.Context.Support.WebApplicationContext.Current
.ConfigureObject(handler, typeof(BasePage).FullName);
}
}
就是這樣! (不要忘記在網上註冊模塊。配置總是)
在搜索的功能(也許優雅),我發現,而是採用了IHttpModule
(餘did't要添加另一個類),你可以聲明BasePage
這樣
public abstract class BasePage : System.Web.UI.Page
{
public IInjectable FooProp {get;set;}
protected override OnPreInit(EventArgs e)
{
Spring.Context.Support.WebApplicationContext.Current
.ConfigureObject(this, typeof(BasePage).FullName);
base.OnPreInit(e);
}
}
和它就像一個魅力,而不需要任何附加的模塊等
欣然這適用於用戶控件以及(儘管在生命週期中的不同的事件,因爲OnPreInit不爲用戶控件存在):
public abstract class BaseControl : System.Web.UI.UserControl
{
public IInjectable FooProp {get;set;}
protected override OnInit(EventArgs e)
{
Spring.Context.Support.WebApplicationContext.Current
.ConfigureObject(this, typeof(BaseControl).FullName);
base.OnInit(e);
}
}
感謝收看!
我建議的是一些Spring.NET功能(如果存在的話),配置「知道」只有抽象類,並從那裏確認孩子的存在並注入到每個孩子配置的屬性 – Jaguar 2010-07-04 15:14:20