属性 手动初始化对象时注入
Property injection upon initializing object manually
当使用 Ninject 属性 注入时,仅当对象由框架(而不是开发人员在代码中)实例化时,以下才有效,以便注入有效:
public class SomeController: Controller {
[Inject]
public DbContext db {get; set;}
...
}
然而,当对象必须由开发人员在代码中实例化时,绑定不会发生(我不想说失败,因为它不会发生)。
public class DataProvision {
[Inject]
public DbContext db {get; set;}
public List<T> GetList<T>() where T: class, new() {
return db.Set<T>().toList();
}
...
}
public class Test {
public static void Test(){
DataProvision dp = new DataProvision();
var getValue = dp.GetList<Person>();
}
}
Ninject是否支持它,如果是,解决方案是什么。
我们这样做的理由:在紧急情况下毫不费力地在备份数据库和活动数据库之间切换
这是预期的行为。如果您 new
创建自己的实例,DI 框架没有机会注入任何东西。如果您的代码可以访问 DI 绑定,请设置一个内核并使用它来实例化您的 class:
public class Test {
public static void Test(){
var kernel = new StandardKernel(new YourDiModule());
DataProvision dp = kernel.Get<DataProvision>();
var getValue = dp.GetList<Person>();
}
}
使用上述策略,您可能需要稍微调整一下 DI 配置,以便在需要时处理上下文。 (您的 Web 应用程序可能通常设置为在每个 Web 请求完成后处理上下文,并且您的测试代码看起来不像是在同类环境中设置为 运行。)
否则,您将需要手动管理依赖项注入:
public class Test {
public static void Test(){
using (var context = new DbContext()) // or however you create contexts
{
DataProvision dp = new DataProvision();
dp.db = context;
var getValue = dp.GetList<Person>();
}
}
}
当使用 Ninject 属性 注入时,仅当对象由框架(而不是开发人员在代码中)实例化时,以下才有效,以便注入有效:
public class SomeController: Controller {
[Inject]
public DbContext db {get; set;}
...
}
然而,当对象必须由开发人员在代码中实例化时,绑定不会发生(我不想说失败,因为它不会发生)。
public class DataProvision {
[Inject]
public DbContext db {get; set;}
public List<T> GetList<T>() where T: class, new() {
return db.Set<T>().toList();
}
...
}
public class Test {
public static void Test(){
DataProvision dp = new DataProvision();
var getValue = dp.GetList<Person>();
}
}
Ninject是否支持它,如果是,解决方案是什么。
我们这样做的理由:在紧急情况下毫不费力地在备份数据库和活动数据库之间切换
这是预期的行为。如果您 new
创建自己的实例,DI 框架没有机会注入任何东西。如果您的代码可以访问 DI 绑定,请设置一个内核并使用它来实例化您的 class:
public class Test {
public static void Test(){
var kernel = new StandardKernel(new YourDiModule());
DataProvision dp = kernel.Get<DataProvision>();
var getValue = dp.GetList<Person>();
}
}
使用上述策略,您可能需要稍微调整一下 DI 配置,以便在需要时处理上下文。 (您的 Web 应用程序可能通常设置为在每个 Web 请求完成后处理上下文,并且您的测试代码看起来不像是在同类环境中设置为 运行。)
否则,您将需要手动管理依赖项注入:
public class Test {
public static void Test(){
using (var context = new DbContext()) // or however you create contexts
{
DataProvision dp = new DataProvision();
dp.db = context;
var getValue = dp.GetList<Person>();
}
}
}