可以在EntityFramework实体对象上使用Ninject

本文关键字:Ninject 对象 实体 EntityFramework | 更新日期: 2023-09-27 18:11:27

我不确定这是否可能,但我想有一个类,可以加载和保存使用实体框架,也使用Ninject填充接口在运行时的具体实现。

我从这样的构造函数开始:

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

这就像Ninject一样工作,我们得到一个Cat -它用于使用实体框架将实体保存到SQLServer。但是,当尝试加载实体时失败,因为实体框架需要一个无参数的构造函数。

所以我试着把它放在这样的属性上:

    [Inject]
    public ICatProvider kitty { get; set; }
    public FancyObject()
    {
    }

可以从DB加载,但是Kitty总是null。

我所有的绑定都是:

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

我猜这是因为我使用实体框架来创建实体,所以Ninject没有看到

我错过了什么明显的东西吗?有什么好办法吗?

可以在EntityFramework实体对象上使用Ninject

你猜对了。您的属性是null,因为:

"使用实体框架来创建实体,所以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)
         }
    }
    
  • 创建一个FancyObjectService,它依赖于ICatProvider并与FancyObject一起工作
  • 等。