Entity framework 实体框架CTP5和Ninject作为我的IOC

Entity framework 实体框架CTP5和Ninject作为我的IOC,entity-framework,ioc-container,ninject,entity-framework-ctp5,Entity Framework,Ioc Container,Ninject,Entity Framework Ctp5,在实体框架CTP5中,是否可以通过IOC容器构造检索到的持久化实体 我使用的是Ninject,它与MVC很好地结合在一起,但在为某些业务规则构建域对象时,我需要将一些服务注入到域对象中 我宁愿使用构造函数注入,而不是方法或属性注入 我不确定您在这里到底想要完成什么,但EF几乎没有扩展点。您所能做的最好的事情就是钩住ObjectContext触发的ObjectMaterialized事件。在CTP5中,您需要在DbContext的构造函数中像这样强制转换DbContext: ((IObjectCo

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

我使用的是Ninject,它与MVC很好地结合在一起,但在为某些业务规则构建域对象时,我需要将一些服务注入到域对象中


我宁愿使用构造函数注入,而不是方法或属性注入

我不确定您在这里到底想要完成什么,但EF几乎没有扩展点。您所能做的最好的事情就是钩住ObjectContext触发的ObjectMaterialized事件。在CTP5中,您需要在DbContext的构造函数中像这样强制转换DbContext:

((IObjectContextAdapter)this).ObjectContext.ObjectMaterialized += 
    this.ObjectContext_OnObjectMaterialized;
然后实现您的函数
ObjectContext\u OnObjectMaterialized(objectsender,objectmaterialedeventargs e)
。您将能够访问您的对象,不幸的是,该对象已经实现。根据您的需要,您可能可以在此处插入一些有趣的行为

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

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


这不符合持久性无知的域对象吗?

我倾向于做与您尝试做的相反的事情。我使我的域对象尽可能地无知(它们本质上是属性包)。当您需要执行某种操作时,比如发送电子邮件,那么我会使用一个服务,并让该方法接收它需要对其执行操作的域对象。在这种情况下,您只需将服务注入到应用程序的各个部分(使用Ninject要简单得多)。

我认为EF code first CTP5会有所帮助。它支持IValidatableObject接口,该接口将ValidationContext对象作为参数。ValidationContext是一个ServiceLocator,因此您应该能够使用ValidationContext对象获取IoC容器的实例。(这只是我最初的想法,但我还没有尝试过任何东西)。对不起,如果我的英语不是很好理解的话

更新 对不起,在我发表这篇评论后,我意识到这个问题与我所理解的大不相同。所以,我自己也尝试了一些事情,经过一些尝试和尝试,再加上更多的谷歌搜索,我终于有了进展。我本来打算把答案贴在这里,但后来又想反对,因为答案会很长。所以,我确实发布了这个博客


这可能会帮助一些谷歌搜索同样的内容。希望这次我答对了。

单词存储库应该是服务(我已经更新了我的原始版本)。例如,一个域对象可能有一些电子邮件发送功能,所以我想在构建时注入一个电子邮件服务。@WDuffy-有意义。不幸的是,MS论坛中的这个响应()证实了,因为EF需要一个零arg构造函数来具体化POCO,所以不能使用经典构造函数注入。唯一的解决方法是1)将此构造函数设置为内部构造函数,然后2)使此构造函数调用具有由IoC容器解析的参数的构造函数。不幸的是,这会因IoC问题而污染您的POCO。ICCustomerRepository接口没有持久性。如果你阅读DDD蓝皮书,你会注意到Eric Evans甚至在一些详细的序列图中这样做。这就是存储库的意义所在,如果它们真的是存储库而不仅仅是花哨的数据访问对象的话。我个人在聚合根中使用了存储库接口,效果非常好。有些离题:“属性包”令人担忧。这意味着您有创建贫血区域的危险。非常离题:酷阿凡达=)我看到了双方的好处(在某种程度上,双方都有争论)。我确实倾向于在对象中保留简单的验证,因此从这个意义上说,我猜它们不是严格意义上的属性包,但是如果一个对象足够复杂,将业务逻辑放入类中会很快膨胀,并且很快会变成1000多行代码(我经常看到这种情况发生)。当我想到“业务逻辑”这个词时,我倾向于想到一系列复杂的规则,如果是这样的话,我更喜欢一个单独的类,如果它只是验证,那么把它放在类中似乎是合理的。一直爱着黑魔法师+1.我也这样做;我让我的POCO几乎不受逻辑限制(除了这里和那里非常简单的setter验证),发送电子邮件之类的问题实际上属于服务层。在我看来,将服务注入域对象似乎是违反直觉的。我附和了第一条评论。如果域对象是属性包,那么它们更像域DTO,而不是域对象。谷歌“贫血领域模型反模式”。此外,域服务不打算成为域逻辑的默认位置。这违背了域对象封装业务逻辑的目的。你可以抛弃“贫血数据模型”之类的术语,引用Fowler之类的人的话,但最终,我看到过,在模型之外包含复杂业务逻辑的系统中编写的成功案例要多得多,而在模型之外包含复杂业务逻辑的系统中编写的成功案例要多得多,而在模型之外包含复杂业务逻辑的系统中,所有业务逻辑都是混乱的,难以维护。任何系统的真正价值在于它能为用户提供多好的服务,而不是它是否遵循各种编程原则。我并不反对原则,但就我而言,现实世界的情景总是比理论更重要。