【问题标题】:Best approach to call similar methods on c#在 c# 上调用类似方法的最佳方法
【发布时间】:2011-06-02 19:47:52
【问题描述】:

我的业务对象类需要知道必须使用什么连接字符串。

我通过将连接字符串传递给 BO 的 connString 属性的代码调用/创建这些 BO,并且也可以从框架控件调用/创建这些 BO,这不允许我设置 connString 属性。 (我必须为连接字符串添加一个附加参数来调用该方法)

我有这样的事情:

public class MyBOClass{
    public FillMethodX(int ID)
    {
        //Fill the BO with data...
    };
    public FillMethodX(int ID, string connString)
    {
        SetConnString(connString);
        FillMethodX(ID);
    };

    public FillMethodY(int ID)
    {
        //Fill the BO with data...
    };
    public FillMethodY(int ID, string connString)
    {
        SetConnString(connString);
        FillMethodY(ID);
    };
}

我可以避免使用重载复制每个方法来以最佳方法传递 connString 吗? (可选参数,泛型等??)

谢谢。

编辑:对不起,我输入了“连接字符串”,但实际上我传递了一个字符串,该字符串表示我的 BO 在内部使用的数据库。

【问题讨论】:

    标签: c# methods


    【解决方案1】:

    有很多方法可以做到这一点,其中一种你已经提到过 - 可选参数。

    另一种方法是公开一个返回当前连接字符串的通用 ConnectionString 属性,然后取消 1 参数重载。调用者需要传递一个连接字符串,并且可以只传递 MyBOClass.ConnectionString。对于那些想知道连接信息从何而来的代码读者来说,这实际上可能会更清楚一些。

    【讨论】:

    • 如果我没有更好的方法,您可以回答有关和附加参数的问题,并且只有一种方法比每种方法有两个重载要好。它成为我如何调用这些方法以获得可读性的解决方案,这看起来既好又简单。
    【解决方案2】:

    去掉不带参数的方法,只剩下:

     public FillMethodY(int ID, string connString)     
     {         SetConnString(connString);  //If connString is null, a default connection will be used       
               FillMethodY(ID);     
     }; 
    

    对于想要使用默认值的调用者,将 null 传递给 connString,然后在 SetConnString 中处理 null 情况并返回默认连接。否则让它使用如果不是 null 则传递的内容并将连接设置为那个。

    那么你就不需要 FillMethodY(int ID) 并且方法调用减少了一半。

    【讨论】:

      【解决方案3】:

      您可以在接受 ConnectionString 的类上创建一个新的构造函数,或者创建一个公共属性 ConnectionString,然后您可以在方法中检索该值。

      public class MyBOClass{
      
      private string connectionString;
      public MyBOClass(string connectioString)
      {
          this.connectionString=connectionString;
      }
      
      public FillMethodX(int ID)
      {
          //here use connectionString
          //Fill the BO with data...
      };
      

      更新

      使用可选参数:

      public class MyBOClass{
      
      
      public FillMethodX(int ID,[Optional, DefaultParameterValue(string.Empty)] string connString)
      {
          //test if connString is null 
          SetConnString(connString);
          FillMethodX(ID);
      };
      

      【讨论】:

      • 谢谢,我的 DAL 从数据库中的表生成 BO 1-1 并放置一个“dbName”属性来做这样的事情(我不太清楚,抱歉),我的问题是我怎么能当我使用自己的控件(并在类+方法上使用参数而没有标识符)或第 3 方 UI 控件(使用反射和调用那些具有默认 ctor 的 BO 类并使用该 BO 上的方法来检索数据)。
      • 我不知道 C# 上存在 [optional] 关键字,但它需要 System.Runtime.InteropServices(听起来很糟糕),我曾经放置一个初始化器,例如:myMethod(string connString bold**= nullbold**) 来执行此操作,并且不知道 [可选] 关键字 :) 感谢您提供的示例,Has Kevin Hsu 建议,使用带有 'connString' 的方法听起来更好一个必需的参数并将 MyBOClass.connStringProp 传递给它以获得可读性,否则,如果我使用可选参数,我可能会遇到运行时错误(null),在我看来,如果我不允许可选参数,我可以避免这种情况跨度>
      【解决方案4】:

      不要在 BO 层传递连接字符串。而是使用标识符,然后在 DAL 层中使用工厂来获取连接字符串/DAL。

      例如,DAL Dll 配置文件:

      <Connections>
          <connection name="test" connectionString="Data Source=####\SQL2008;Initial Catalog=test;User Id=####;Password=####;" providerName="System.Data.SqlClient">test</connection>
          <connection name="test2" connectionString="Data Source=####\SQL2008;Initial Catalog=test2;User Id=####;Password=####;" providerName="System.Data.SqlClient">test2</connection> 
      </Connections>
      

      当客户端登录到您的应用程序时,为他们提供可用连接的下拉列表(或者如果您不希望用户选择连接,则通过配置文件将其隐藏),然后使用它来制造数据库连接。

      在层之间传递的对象将具有此标识符。使用标识符创建 DAL 连接。

      可以在层之间传递的示例数据传输对象(带有标识符):

          /// <summary>
          /// A data transfer object is sent between layers.  It has a few base properties
          /// as well as a list of payload objects.
          /// </summary>
          [DataContract(Namespace= SharedModelNamespace.Namespace.SharedModel)]
          public class DataTransferObject
          {
              /// <summary>
              /// As part of the data transfer object, it specifies what environment to connect
              /// to should it make a DAL call.
              /// </summary>
              [DataMember]
              public string DataEnvironment {get; set };
      
              /// <summary>
              /// These are the list of objects (the payload) that will be transferred
              /// back and forth from the server to the client.
              /// </summary>
              [DataMember]
              public List<BasePOCO> DataTransferObjects { get; set; }
      

      【讨论】:

      • 谢谢我没有正确质疑它,对不起。我使用了一个做类似事情的框架,但我的主要问题是这个框架有一个 UI 允许我“自动”从 BO 检索数据,但是这个框架使用这个“自动”的东西使用反射并创建一个实例一个无参数的构造函数(并且没有引用它将使用的 BO,它动态地创建它,检索数据并处理它)并且它不允许我在这个自动的东西上填充“dataEnviroment”属性
      • 好的,很抱歉。请参阅我的第二个建议。谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多