Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 扩展一个类及其一个属性_C#_Dependency Injection - Fatal编程技术网

C# 扩展一个类及其一个属性

C# 扩展一个类及其一个属性,c#,dependency-injection,C#,Dependency Injection,有一个班级设计的问题,我一次又一次地遇到,我逐渐意识到我一定是做错了什么。其思想是类B:A。这些类使用配置对象和BConfig:AConfig。问题是我不能想出一个好方法来访问BConfig中的属性 下面是一个简化的问题示例 public class Request{ public virtual RequestConfiguration Config{ get { if(Config == null) Config= ConfigurationMana

有一个班级设计的问题,我一次又一次地遇到,我逐渐意识到我一定是做错了什么。其思想是类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"]; }
    }
}
显然,这段代码没有编译是否可以对该代码进行任何小的更改以实现相同的原则?或者我是否需要采取完全不同的方法


目标是我可以使用在配置文件中设置的简单依赖项注入来确定发出何种类型的请求。

这取决于如何在RequestConfiguration和AuthRequestConfiguration上声明属性

例如,如果您在RequestConfiguration类中将Url属性声明为virtual,并在AuthRequestConfiguration类中将其声明为重写,则它应该执行您所期望的操作


MSDN中的详细示例如下

如何进行
请求
通用<代码>请求,其中TConfig:RequestConfiguration:

公共类请求,其中TConfig:RequestConfiguration
{
私有TConfig\u config;
公共虚拟TConfig配置
{
获取{return\u config??(\u config=ConfigurationManager.GetSection(“RequestConfig”)作为TConfig);}
}
公共虚拟字符串DoSomething()
{
返回“Url:+Config.Url;
}
}
公共类AuthRequest:请求
{
公共重写字符串DoSomething()
{
返回String.Format(“Url:{0}U:{1}P:{2}”、Config.Url、Config.User、Config.Pass);
}
}
公共类RequestConfiguration:ConfigurationSection
{
[ConfigurationProperty(“Url”,IsRequired=true)]
公共字符串Url
{
获取{return(string)this[“Url”];}
}
}
公共类AuthRequestConfiguration:RequestConfiguration
{
[配置属性(“用户”,IsRequired=true)]
公共字符串用户
{
获取{return(string)this[“User”];}
}
[ConfigurationProperty(“通过”,IsRequired=true)]
公共字符串通行证
{
获取{return(string)this[“Pass”];}
}
}

这能解决你的问题吗?至少代码生成:)

一个字不。我想给你指出一个excat的方向,但我真的很难理解它的意图。DI是通过聚合(接口)而不是继承来完成的,所以AConfig和BConfig应该是IConfig的实现,这样您的暴露问题就可以解决了。基本上,当你在做DI的时候,只要你达到继承的目的,就要用极端怀疑的态度对待你想要继承的愿望。重构两个类以从抽象IRequest类继承。我遇到的问题是,所有继承类都需要使用基本RequestConfiguration的锅炉板代码(为什么我将其设置为抽象类而不是接口)。您是否可以将其委托给其他类实例,哪怕它是一个静态助手类。因此,它们不是一个thingie,而是一个thingie。@托尼·霍普金森:我最终创建了一个抽象泛型类,该类实现了克里斯蒂安·赫朗(Kristian Hellang)提供的解决方案,请求和AuthRequest都从中继承。这可能不是最好的设计,但就我而言,它工作得很好。很好。。。星期一好好考虑一下这个主意。