考虑以下情况,
我有由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
}
}
的最佳方法是什么?
public DBEntity (String connectionString) : base (connectionString)
我将永远做new DBEntity(string)
答案 0 :(得分:4)
您无法更改在构造函数中创建的对象的引用。换句话说,当你调用构造函数时,对象在内存中初始化,你只需要设置它。
相反,您应该使用静态方法来控制返回类型。您可以将其放在另一个类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);
}
答案 1 :(得分:0)
您无法延迟对基础构造函数的调用。基本构造函数始终首先触发。这是为了防止你有一个半初始化的类。
我认为如果要将调用偏离基类,我应该创建两个构造函数。或者,如dotctor所述:创建一个工厂类。如果这样做可能取决于使用泛型和初始化那些泛型类型的实例的需要。
答案 2 :(得分:0)
目前您允许null
或空字符串作为connectionString
的值,我认为这是错误的。
如果要使用具有参数connectionString
的构造函数,则具有以提供有效值。如果你这样做,那么整个问题就会消失,因为那个构造函数不再具有二元性了。
答案 3 :(得分:-1)
遵循"在构造函数"中没有逻辑的简单规则,我将提供两个构造函数 - 一个有一个,一个没有参数。