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"]; }
    }
}

明らかに、このコードはコンパイルされません。 同じ原則を達成するために行うことができるこのコードへの小さな変更はありますか? それとも、まったく異なるアプローチを一緒に行う必要がありますか?

目標は、構成ファイルに設定された単純な依存性注入を使用して、作成する要求のタイプを決定できるようにすることです。

4

2 に答える 2

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"]; }
    }
}

それはあなたの問題を解決しますか?少なくともコードビルド:)

于 2013-02-17T18:45:00.790 に答える
0

これは、RequestConfigurationおよびAuthRequestConfigurationでプロパティがどのように宣言されているかによって異なります。

たとえば、RequestConfigurationクラスでUrlプロパティを仮想として宣言し、AuthRequestConfigurationクラスでオーバーライドとして宣言すると、期待どおりの動作をするはずです。

MSDNの詳細な例は、http://msdn.microsoft.com/en-us/library/9fkccyh4(v = vs.80).aspxにあります

于 2013-02-17T18:33:15.613 に答える