可以在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没有看到
我错过了什么明显的东西吗?有什么好办法吗?
你猜对了。您的属性是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
一起工作 - 等。