2013-02-17 28 views
0

有這個類的設計問題,我一直反覆運行,我已經意識到我必須做錯了什麼。這個想法是B類:A.這些類使用配置對象和BConfig:AConfig。問題是,我不能想出一個讓BConfig中的屬性可訪問的好方法。擴展一個類和它的一個合適的東西

下面是該問題的簡單示例。

public class Request{ 

    public virtual RequestConfiguration Config{ 
    get 
    { 
    if(Config == null) 
     Config= ConfigurationManager.GetSection("RequestConfig") 
       as RequestConfiguration; 
    return Config; 
    } 
    } 

    public virtual string DoSomething(){ 
    return "Url:" + Config.Url; 
    } 

} 

public class AuthRequest : Request 
{ 
    public override RequestConfiguration Config 
    get 
    { 
    if(Config == null) 
     Config= ConfigurationManager.GetSection("RequestConfig") 
       as AuthRequestConfiguration; 
    return Config; 
    } 
    } 

    public override string DoSomething(){ 
    return String.Format("Url:{0} U:{1} P:{2}",Config.Url,Config.User,Config.Pass); 
    } 
} 

/*---- Configuration Classes ----*/ 
public class RequestConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("RequestHost", IsRequired = true)] 
    public string RequestHost 
    { 
     get { return (string)base["RequestHost"]; } 
    } 
}  
public class AuthRequestConfiguration : RequestConfiguration 
{ 
    [ConfigurationProperty("User", IsRequired = true)] 
    public string User 
    { 
     get { return (string)base["User"]; } 
    } 

    [ConfigurationProperty("Pass", IsRequired = true)] 
    public string Pass 
    { 
     get { return (string)base["Pass"]; } 
    } 
} 

顯然這段代碼不能編譯。 這段代碼是否有任何細微的變化可以實現相同的原理?或者我需要採取一個完全不同的方法嗎?

目標是我可以在配置文件中設置簡單的依賴注入來確定要創建什麼類型的請求。

+0

總之,我想指出一個激動人心的方向,但我真的很努力地看到這個意圖。 DI是通過聚合(接口)而不是繼承來完成的,所以AConfig和BConfig應該是IConfig的實現,那麼你的暴露問題可能會消失。從本質上講,只要您在做直接投資時達到繼承目的,就會以極端懷疑的態度對待這樣做的願望。 – 2013-02-17 18:47:31

+0

發佈此問題後,我意識到了一點。重構這兩個類以從一個抽象的IRequest類繼承。我有問題的地方是有所有的繼承類的鍋爐板代碼需要使用基本的RequestConfiguration(爲什麼我把它作爲一個抽象類而不是Interface)。 – NSjonas 2013-02-18 01:37:32

+0

你可以委託給其他類實例,即使它是一個靜態幫助類的恐怖。所以,不要成爲一個東西,他們有一個東西。 – 2013-02-18 02:04:44

回答

1

有關使Request一般什麼; Request<TConfig> where TConfig : RequestConfiguration

public class Request<TConfig> where TConfig : RequestConfiguration 
{ 
    private TConfig _config; 

    public virtual TConfig Config 
    { 
     get { return _config ?? (_config = ConfigurationManager.GetSection("RequestConfig") as TConfig); } 
    } 

    public virtual string DoSomething() 
    { 
     return "Url:" + Config.Url; 
    } 
} 

public class AuthRequest : Request<AuthRequestConfiguration> 
{ 
    public override string DoSomething() 
    { 
     return String.Format("Url:{0} U:{1} P:{2}", Config.Url, Config.User, Config.Pass); 
    } 
} 

public class RequestConfiguration : ConfigurationSection 
{ 
    [ConfigurationProperty("Url", IsRequired = true)] 
    public string Url 
    { 
     get { return (string) this["Url"]; } 
    } 
} 

public class AuthRequestConfiguration : RequestConfiguration 
{ 
    [ConfigurationProperty("User", IsRequired = true)] 
    public string User 
    { 
     get { return (string) this["User"]; } 
    } 

    [ConfigurationProperty("Pass", IsRequired = true)] 
    public string Pass 
    { 
     get { return (string) this["Pass"]; } 
    } 
} 

會解決你的問題嗎?至少代碼版本:)

+0

不錯...星期一玩這個想法。 – NSjonas 2013-02-18 01:30:33

0

這取決於如何在RequestConfiguration和AuthRequestConfiguration上聲明屬性。

例如,如果您在RequestConfiguration類中聲明Url屬性爲虛擬並在AuthRequestConfiguration類中聲明它爲覆蓋,它應該執行您所期望的操作。

從MSDN詳細的例子就是在這裏http://msdn.microsoft.com/en-us/library/9fkccyh4(v=vs.80).aspx

相關問題