我不确定这是否可行,但我想要一个可以使用 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/