我可以看到如何使用autofac实例化类的对象,然后将它们传递给db4o进行存储。当我从db4o检索对象实例时,如何使用autofac注册对象?
我最初计划使用db4o的MSBuild工具来实现透明的激活/持久性,但看起来我可能必须为我的所有Model对象手动实现IActivatable接口,以便我可以在{{1在激活它们时注册IActivatable::Bind()
个指针。
最糟糕的是,我预见this
的实现必须访问当前Autofac生命周期范围的Singleton才能进行注册。显然,我无法将当前生命周期范围传递给db4o正在激活的对象实例。就像通过范围一样糟糕,我可以想象人们考虑将当前的生活范围固定在公共单身人士身上的呻吟声。
另一种方法似乎是实现db4o的类型处理程序并在此处拦截对象实例化,但这似乎取消了使用db4o存储对象所获得的任何收益。
或者我是否因为使用autofac实例化所有对象而过于疯狂? (例如,我有一把锤子,一切看起来像钉子。)模型对象是否应该由普通的旧“新”和db4o使用的任何魔法实例化?换句话说,仅对我的View,ViewModel和Controller对象使用autofac。
答案 0 :(得分:3)
没有“真正的路径”:)但这里推荐的方法是远离在域模型中直接使用服务,而是将“域事件”发送给支持IoC的处理程序。
Jimmy Bogard在这个主题上有很多帖子 - 有一个结构图的例子,你应该能够适应Autofac:http://lostechies.com/jimmybogard/2010/08/04/container-friendly-domain-events/
(顺便说一句,巧合的是,我有一个基于Autofac的示例实现,我将在接下来的几周内清理它。)
答案 1 :(得分:1)
我建议用Autofac实例替换每个'new'。我的经验法则是,当一个对象需要复杂的依赖(不是简单集合,核心CLR类型,其他简单对象)时,我让Autofac完成工作。简单的域对象我通常只使用new运算符或创建工厂。
如果我的问题得到解决,我不能100%肯定。您希望在实例化时将某些服务绑定到您的域模型?那么我建议使用events。您可以使用db4o事件来检测对象何时被存储,激活等。在这样的事件监听器中,您可以使用当前的Autofac范围来传递其他服务。
顺便说一下。 db4o已经调用了IActivatable :: Bind()。你不需要做任何其他事情。
一般情况下,我会尝试正确地确定所有内容的范围,而不是滥用Autofac作为服务定位器。