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