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 回答