属性 手动初始化对象时注入

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>();
        }
    }
}