2013-04-30 104 views
3

我不确定这是否可行,但我想要一个可以使用实体框架加载和保存的类,该实体框架还使用Ninject在运行时用具体实现填充接口。可以在EntityFramework实体对象上使用Ninject吗?

我开始用这样的构造:

public FancyObject(ICatProvider kitty) 
    { 
     this.kitty = kitty; 
    } 

这工作尽可能Ninject推移,我们得到一个猫 - 和它的作品保存使用实体框架的实体SQLServer的。但是,尝试加载实体时失败,因为实体框架需要无参数的构造函数。

于是,我把它放在一个属性是这样的:

[Inject] 
    public ICatProvider kitty { get; set; } 

    public FancyObject() 
    { 
    } 

这可以从数据库载入,但小鹰始终为空。

所有我在绑定是:

kernel.Bind<ICatProvider>().To<FancyFileBasedCat>(); 

我猜这是因为我使用实体框架来创建的实体,因此Ninject没有得到一看

我在这里错过了一些明显的东西吗?有没有一个很好的方法来做到这一点?

回答

5

你的猜测是正确的。因为:

“使用实体框架创建实体,所以Ninject没有看到。”

但是你可以使用Kernel.Inject方法(wiki)注入依赖于现有实例:具有依赖性

var fancyObject = db.GetFancyObject(); 
kernel.Inject(fancyObject); 
// fancyObject.kitty should be filled in. 

实体通常是一个代码气味,也许你应该重新考虑你的设计。在需要时

  • 传递服务:有很多的方式,以避免类似的实体依赖

    public class FancyObject 
    { 
        public Result MethodWorkingWithCats(int somearg, ICatProvider kitty) 
        { 
          reuturn DoSoemThing(this, somearg, kitty) 
        } 
    } 
    
  • FancyObject
  • 创建 FancyObjectService其dependy在 ICatProvider及作品/
+0

是的,它可能不是最优雅的设计 - 需要手动注入每个实例感觉很hacky - 而这仅仅是由于臭的依赖性所必需的。我认为你是对的 - 将其注入更高级别,然后根据需要将它传递给实体可能是更好的解决方案。谢谢。 – Kaine 2013-04-30 15:29:30

相关问题