【发布时间】:2014-03-31 15:50:01
【问题描述】:
无法获取传递给 kernel.Get() 的 ConstructorArgument 参数的值。我想使用参数的值来确定两个字符串值中的哪一个将传递给构造函数。该参数实际上在预期的时候就在那里,我只是无法获得它的值。在调用参数的 GetValue 方法后,我最终得到了一个 null ref 异常:
namespace MyNS.DBProviders {
public abstract class DBProviderBase {
private ObjectContext _db;
public DBProviderBase(ObjectContext db) {
_db = db;
}
...
//abstract methods here
...
}
public class DBProviderB : DBProviderBase {
public DBProviderB(ObjectContext db) : base(db) {}
//implementation details... applies to two DBs w/ same schema
}
public class DBProviderModule : NinjectModule {
public override void Load() {
//Bind DB providers
Bind<DBProviderBase>().To<DBProviderB>();
//Bind LINQ contexts to DB providers
Bind<ObjectContext>().To<EF_DB_b>()
.When(UseEF_DB_b_conn1).WithConstructorArgument(
"connectionString"
, ConfigurationManager.ConnectionStrings["EF_DB_b_conn1"]
.ToString()
)
;
Bind<ObjectContext>().To<EF_DB_b>()
.When(UseEF_DB_b_conn2).WithConstructorArgument(
"connectionString"
, ConfigurationManager.ConnectionStrings["EF_DB_b_conn2"]
.ToString()
)
;
}
public static bool UseEF_DB_b_conn1(IRequest req) {
string idNum = (string)req.Parameters.First(
p => p.Name == "idNum"
).GetValue(null, null);
//NULL REF EXCEPTION
return x != null ? idNum.Substring(0, 1) == "2" : false;
}
public static bool UseEF_DB_b_conn2(IRequest req) {
return !UseEF_DB_b_conn1(req);
}
}
}
namespace MyNS {
public static class DBProviderFactory {
public static DBProviderBase GetDBProvider(string idNum) {
var kernel = new Bootstrapper().Kernel;
return kernel.Get<DBProviderBase>(
new ConstructorArgument("idNum", idNum)
);
}
}
}
...//idNum received from elsewhere
var db = DBProviderFactory.GetDBProvider(idNum);
var something = db.GetSomethingFromOneOfThreeDBs();
【问题讨论】:
-
在您编辑后,我认为您的代码存在逻辑错误。在您当前的实现中,
return UseEF_DB_b_conn1() || UseEF_DB_b_conn2();始终返回 true。所以我不确定你什么时候应该使用DBProviderB的绑定。 -
做了另一个编辑,希望能澄清更多。 ProviderB 是现在唯一的一个。我的情况是我们有两个(或更多)具有相同架构的数据库(或足够接近以具有通用接口)。在 ProviderB 的情况下,它只是一组实体框架类,唯一会改变的是 connectionString。我只是希望能够检查运行时值 (idNum) 以确定将使用哪个数据库。
标签: parameters dependency-injection inversion-of-control ninject constructor-injection