使用Enterprise Lib配置数据库访问时,无法从DatabaseProviderFactory实例调用Create方法的问题咨询
解决Enterprise Library数据库访问中的"A field initializer cannot reference the non-static field..."错误
嘿,这个问题我之前帮好几个开发者搞定过,咱们先把问题拆明白,再给你具体的解决方案~
错误原因拆解
这个编译错误的核心逻辑其实很简单:C#不允许你在类的字段初始化阶段(也就是直接在类里给字段赋值的代码块),引用同一个类里的非静态成员。
为什么呢?因为字段初始化器是在类的构造函数执行之前运行的,这时候类的实例还没完全创建出来,非静态的name字段还属于“未就绪”的状态,自然没法被引用。
举个例子,你大概率写了类似这样的错误代码:
public class DataAccessLayer { // 非静态的实例字段 private string name = "MyEnterpriseLibDb"; // ❌ 错误:字段初始化时直接引用了非静态的name private Database db = DatabaseProviderFactory.Create(name); }
具体解决方案
根据你的实际需求,有两种常用的修复方式:
方案1:把name改成静态字段(如果不需要实例级别的区分)
如果你的数据库名称是全局固定的,不需要每个实例都用不同的名称,那直接把name改成静态字段就行:
public class DataAccessLayer { // 改成静态字段,让初始化器可以访问 private static string name = "MyEnterpriseLibDb"; private Database db = DatabaseProviderFactory.Create(name); }
方案2:把初始化逻辑移到构造函数里(更推荐的实例场景)
如果name需要是实例专属的(比如不同实例连接不同数据库),那把Database的初始化代码挪到构造函数里就对了——构造函数执行时,类的实例已经完全创建,非静态成员可以正常访问:
public class DataAccessLayer { private string name = "MyEnterpriseLibDb"; private Database db; public DataAccessLayer() { // ✅ 构造函数内初始化,此时实例已就绪 db = DatabaseProviderFactory.Create(name); } // 进阶:支持传入自定义数据库名称的构造函数 public DataAccessLayer(string customDbName) { name = customDbName; db = DatabaseProviderFactory.Create(name); } }
额外场景:延迟初始化(如果需要懒加载)
要是你希望Database实例在真正被用到的时候才创建,可以用Lazy<T>实现懒加载,这样既符合初始化规则,又能优化性能:
public class DataAccessLayer { private string name = "MyEnterpriseLibDb"; private Lazy<Database> lazyDb; public DataAccessLayer() { lazyDb = new Lazy<Database>(() => DatabaseProviderFactory.Create(name)); } // 用属性暴露数据库实例,第一次访问时才初始化 public Database Db => lazyDb.Value; }
总结一下
核心原则就是:不要在字段初始化器里直接访问非静态的实例成员,把初始化逻辑放到构造函数、实例方法或者懒加载逻辑里,等类的实例完全创建后再去调用那些成员就没问题啦~
内容的提问来源于stack exchange,提问作者Rabins Rai
相关产品推荐
相关产品推荐

