繁体   English   中英

从部分类c#调用Base实体构造函数

[英]Calling Base entity constructor from partial class c#

考虑以下情况,

我有DB First方法创建的实体,

// auto-generated class
public partial DBEntity : DBContext
{
   public DBEntity ()
        : base("name=DBEntity ") // gets connection string from api.config
    {
    }
}

我有时需要构建并传递连接字符串,所以我创建了这个,

public partial class DBEntity 
{
    public DBEntity (String connectionString)
    {
        if (string.IsNullOrEmpty(connectionString))
            new DBEntity ();
        else
            base(connectionString); // this one fails
    }
}

什么是最好的方式

  1. 如果连接字符串为空,则调用无参数实体构造函数?
  2. 如果conn string不为空,则从参数化构造函数中调用基础构造函数,并实现下面的操作,

public DBEntity (String connectionString) : base (connectionString)

我将永远做一个new DBEntity(string)

您无法更改在构造函数中创建的对象的引用。 换句话说,当你调用一个构造函数时,对象在内存中初始化,你只需要设置它。

相反,您应该使用静态方法,它允许您控制返回类型。 您可以将它放在DbEntityFactory等其他类中,并调用DbEntityFactory.Create或将其放在DbEntity类中并调用DbEntity.Create

public static DBEntity Create(String connectionString)
{
    if (string.IsNullOrWhiteSpace(connectionString)) //use this instead of IsNullOrEmpty
        return new DBEntity();
    else
        return new DBEntity(connectionString); 
}

您不能延迟对基础构造函数的调用。 基础构造函数始终首先触发。 这是为了防止你有一个半初始化的类。

我想你应该创建两个构造函数,如果你想将调用偏离基类。 或者,如dotctor所述 :创建一个工厂类。 如果这将起作用可能取决于使用泛型和初始化这些泛型类型的实例的需要。

目前你允许null或空字符串作为connectionString的值,我认为这是错误的。

如果要使用具有参数connectionString的构造函数,则必须提供有效值。 如果你这样做,那么整个问题就会消失,因为那个构造函数不再具有二元性。

按照“构造函数中没有逻辑”这个简单的规则,我将提供两个构造函数 - 一个有一个,一个没有参数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM