能否在EntityFramework实体对象上使用Ninject?

3
我不确定这是否可能,但我想要一个类,可以使用Entity Framework进行加载和保存,同时在运行时使用Ninject填充接口与具体实现。
我从以下构造函数开始:
    public FancyObject(ICatProvider kitty)
    {
        this.kitty = kitty;
    }

就 Ninject 而言,这样做是可行的,我们可以得到一个 Cat - 并且它在使用 Entity Framework 将实体保存到 SQLServer 时也能正常工作。然而,当尝试加载实体时,它会失败,因为 Entity Framework 需要一个无参构造函数。

于是我尝试像这样将它放在属性上:

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

    public FancyObject()
    {
    }

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

我在绑定中只有:

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

我猜这是因为我正在使用Entity Framework来创建实体,所以Ninject没有被注意到。这里是否有什么明显的遗漏?有没有一种好的方法来解决这个问题?
1个回答

5
你的猜测是正确的。你的属性是null,因为:

"使用Entity Framework创建实体,所以Ninject没有被调用。"

但你可以使用Kernel.Inject方法(wiki)来向现有实例注入依赖项:
var fancyObject = db.GetFancyObject();
kernel.Inject(fancyObject);
// fancyObject.kitty should be filled in.

实体之间存在依赖通常是代码异味,你可能需要重新思考你的设计。有很多方法可以避免实体之间的依赖关系,例如:

  • Passing the service when it is needed:

    public class FancyObject
    {
         public Result MethodWorkingWithCats(int somearg, ICatProvider kitty)
         {
              reuturn DoSoemThing(this, somearg, kitty)
         }
    }
    
  • Create a FancyObjectService which dependy on the ICatProvider and works on/with FancyObject
  • etc.

是的,这可能不是最优雅的设计 - 需要手动注入每个实例感觉非常粗糙 - 这只是由于有问题的依赖关系所需。我认为你是对的 - 在更高的层面上注入它,然后根据需要将其传递到实体中可能是更好的解决方案。谢谢。 - Kaine

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接