在实体框架 CTP5 中是否可以通过 IOC 容器构造检索到的持久实体?
我正在使用 Ninject,它与 MVC 绑定得很好,但是当为某些业务规则构造它们时,我需要将一些服务注入到我的域对象中。
我宁愿使用构造函数注入而不是方法或属性注入来做到这一点。
在实体框架 CTP5 中是否可以通过 IOC 容器构造检索到的持久实体?
我正在使用 Ninject,它与 MVC 绑定得很好,但是当为某些业务规则构造它们时,我需要将一些服务注入到我的域对象中。
我宁愿使用构造函数注入而不是方法或属性注入来做到这一点。
我不确定您究竟想在这里完成什么,但 EF 几乎没有可扩展性点。您可以做的最好的事情是挂钩到由 ObjectContext 触发的 ObjectMaterialized 事件。在 CTP5 中,您需要在 DbContext 的构造函数中像这样转换 DbContext:
((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized +=
this.ObjectContext_OnObjectMaterialized;
然后实现你的功能ObjectContext_OnObjectMaterialized(object sender, ObjectMaterializedEventArgs e)
。您将能够访问您的对象,不幸的是,该对象已经物化了。根据您的需要,您可能可以在这里破解一些有趣的行为。
顺便说一句,这句话对我来说毫无意义:
在为某些业务规则构建域对象时,我需要将一些存储库注入到我的域对象中。
这不违反持久性无知域对象吗?
我倾向于做你想做的相反的事情。我使我的域对象尽可能无知(它们本质上是财产包)。当您需要执行某种操作(例如发送电子邮件)时,我会为此使用服务,并让该方法获取执行操作所需的域对象。在这种情况下,您只需将服务注入应用程序的各个部分(这使用 Ninject 完成起来要简单得多)。
我认为 EF 代码优先 CTP 5 可能会有所帮助。它尊重 IValidatableObject 接口,该接口将 ValidationContext 对象作为参数。ValidationContext 是一个 ServiceLocator,因此您应该能够使用 validationContext 对象获取 IoC 容器的实例。(这只是我最初的想法,虽然我没有尝试过任何东西)。对不起,如果我的英语不是很懂。
更新 对不起,就在我发布此评论后,我意识到这个问题与我所理解的完全不同。所以,我自己确实尝试了一些东西,经过一些尝试和尝试以及更多的谷歌搜索,我能够到达某个地方。我打算在这里发布答案,但后来考虑反对它,因为答案会很长。所以,我确实发布了这个博客。
http://nripendra-newa.blogspot.com/2011/02/entity-framework-ctp5-injecting-with.html
可能这可能会帮助一些搜索相同内容的谷歌用户。希望这次我的问题是正确的。