3

在实体框架 CTP5 中是否可以通过 IOC 容器构造检索到的持久实体?

我正在使用 Ninject,它与 MVC 绑定得很好,但是当为某些业务规则构造它们时,我需要将一些服务注入到我的域对象中。

我宁愿使用构造函数注入而不是方法或属性注入来做到这一点。

4

3 回答 3

1

我不确定您究竟想在这里完成什么,但 EF 几乎没有可扩展性点。您可以做的最好的事情是挂钩到由 ObjectContext 触发的 ObjectMaterialized 事件。在 CTP5 中,您需要在 DbContext 的构造函数中像这样转换 DbContext:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
    this.ObjectContext_OnObjectMaterialized;

然后实现你的功能ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e)。您将能够访问您的对象,不幸的是,该对象已经物化了。根据您的需要,您可能可以在这里破解一些有趣的行为。

顺便说一句,这句话对我来说毫无意义:

在为某些业务规则构建域对象时,我需要将一些存储库注入到我的域对象中。

这不违反持久性无知域对象吗?

于 2011-01-19T05:04:42.183 回答
1

我倾向于做你想做的相反的事情。我使我的域对象尽可能无知(它们本质上是财产包)。当您需要执行某种操作(例如发送电子邮件)时,我会为此使用服务,并让该方法获取执行操作所需的域对象。在这种情况下,您只需将服务注入应用程序的各个部分(这使用 Ninject 完成起来要简单得多)。

于 2011-01-19T14:54:07.643 回答
0

我认为 EF 代码优先 CTP 5 可能会有所帮助。它尊重 IValidatableObject 接口,该接口将 ValidationContext 对象作为参数。ValidationContext 是一个 ServiceLocator,因此您应该能够使用 validationContext 对象获取 IoC 容器的实例。(这只是我最初的想法,虽然我没有尝试过任何东西)。对不起,如果我的英语不是很懂。

更新 对不起,就在我发布此评论后,我意识到这个问题与我所理解的完全不同。所以,我自己确实尝试了一些东西,经过一些尝试和尝试以及更多的谷歌搜索,我能够到达某个地方。我打算在这里发布答案,但后来考虑反对它,因为答案会很长。所以,我确实发布了这个博客。

http://nripendra-newa.blogspot.com/2011/02/entity-framework-ctp5-injecting-with.html

可能这可能会帮助一些搜索相同内容的谷歌用户。希望这次我的问题是正确的。

于 2011-02-06T11:07:35.410 回答