c# - 是否可以在 EntityFramework 实体对象上使用 Ninject?

标签 c# entity-framework ninject

我不确定这是否可行,但我想要一个可以使用 Entity Framework 加载和保存的类,该 Entity Framework 还使用 Ninject 在运行时使用具体实现填充接口(interface)。

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

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

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

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

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

    public FancyObject()
    {
    }

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

我在绑定(bind)中拥有的是:

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

我猜这是因为我正在使用 Entity Framework 来创建实体,所以 Ninject 无法查看。

我在这里遗漏了什么明显的东西吗?有什么好的方法可以做到这一点吗?

最佳答案

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

"using the Entity Framework to create the entities and so Ninject isn't getting a look in."

但是您可以使用 Kernel.Inject 方法 ( wiki ) 将依赖项注入(inject)现有实例:

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)
         }
    }
    
  • 创建一个依赖于 ICatProvider 并与 FancyObject 一起工作的 FancyObjectService
  • 等等

关于c# - 是否可以在 EntityFramework 实体对象上使用 Ninject?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16303125/

相关文章:

c# - 无法删除用户外部登录

c# - 在类构造函数中将 icollection 设置为列表时,如何通过索引从 icollection 中获取项目?

asp.net - Ninject 在 Web 服务中注入(inject)服务接口(interface)

entity-framework - EF Code First 给出错误:当 IDENTITY_INSERT 设置为 OFF 时,无法在表 'People' 中插入标识列的显式值。

wpf - ViewModel 定位器如何在模块化系统中工作

c# - 是否可以更改 MEF 创建导入对象的方式?

c# - 如何使用 Xamarin 在 iOS 8 中制作表格单元格和分隔符全宽?

c# - 将 C++ int 数组编码到 C#

c# - C# 中的 ReadOnly 与 VB.NET 中的对比

c# - 在 C# 中使用 TakeWhile 进行 Linq