3

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

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

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

就 Ninject 而言,这很有效,我们得到了一个 Cat - 它适用于使用 Entity Framework 将实体保存到 SQLServer。但是,在尝试加载实体时它会失败,因为 Entity Framework 需要一个无参数的构造函数。

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

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

    public FancyObject()
    {
    }

这可以从数据库加载,但 Kitty 始终为空。

我在绑定中的所有内容是:

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

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

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

4

1 回答 1

5

你的猜测是对的。您的财产是null因为:

“使用实体框架来创建实体,因此 Ninject 没有进入。”

但是,您可以使用该Kernel.Inject方法 ( w​​iki ) 将依赖项注入现有实例:

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
  • 等等
于 2013-04-30T15:16:39.273 回答