Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mvvm 如何为我的模型对象集成db4o和autofac?_Mvvm_Ioc Container_Autofac_Db4o - Fatal编程技术网

Mvvm 如何为我的模型对象集成db4o和autofac?

Mvvm 如何为我的模型对象集成db4o和autofac?,mvvm,ioc-container,autofac,db4o,Mvvm,Ioc Container,Autofac,Db4o,我可以看到如何使用autofac实例化类的对象,然后将这些对象传递给db4o进行存储。当我需要从db4o检索对象实例时,如何向autofac注册对象 我最初计划使用db4o的MSBuild工具来实现透明激活/持久化,但看起来我可能必须为所有模型对象手动实现IActivatable接口,以便我可以在IActivatable::Bind()中插入额外的代码,以便在激活指针时注册此指针 最糟糕的是,我预计,IActivatable::Bind()的实现必须访问当前Autofac生存期范围的一个单例来进

我可以看到如何使用autofac实例化类的对象,然后将这些对象传递给db4o进行存储。当我需要从db4o检索对象实例时,如何向autofac注册对象

我最初计划使用db4o的MSBuild工具来实现透明激活/持久化,但看起来我可能必须为所有模型对象手动实现IActivatable接口,以便我可以在
IActivatable::Bind()
中插入额外的代码,以便在激活指针时注册
指针

最糟糕的是,我预计,
IActivatable::Bind()
的实现必须访问当前Autofac生存期范围的一个单例来进行注册。显然,我无法将当前生存期范围传递给db4o正在激活的对象实例。我可以想象人们考虑将当前的生活范围保留在一个公共单身者身上时发出的呻吟

另一种方法似乎是实现db4o的类型处理程序,并在此时拦截对象实例化,但这似乎破坏了我使用db4o存储对象所获得的任何收益

还是说我对使用autofac实例化所有对象的想法有点太疯狂了?(例如,我有一把锤子,所有东西看起来都像钉子。)模型对象是否应该用普通的“新”和db4o使用的任何魔法来实例化?换句话说,仅对我的视图、视图模型和控制器对象使用autofac。

没有“真实路径”:)但这里推荐的方法是避免直接在域模型中使用服务,而是将“域事件”分派给启用IoC的处理程序

Jimmy Bogard在这一主题上发表了大量文章-有一个StructureMap示例,您应该能够适应Autofac:

(顺便说一句,巧合的是,我有一个基于Autofac的示例实现,我将在未来几周内进行清理并发布。)

没有“真正的路径”:)但这里推荐的方法是避免直接在域模型中使用服务,而是将“域事件”分派给启用IoC的处理程序

Jimmy Bogard在这一主题上发表了大量文章-有一个StructureMap示例,您应该能够适应Autofac:


(顺便说一句,巧合的是,我有一个基于Autofac的示例实现,我正在清理它,准备在未来几周发布。)

我建议用Autofac实例化替换每个“新的”。我的经验法则是,当一个对象需要复杂的依赖项(不是简单的集合、核心CLR类型、其他简单对象)时,我会让Autofac来完成这项工作。简单的域对象我通常只使用新操作符或创建工厂

我不能百分之百肯定你的问题是否正确。您想在实例化域模型时将某些服务绑定到它们吗?那么我建议使用。您可以使用db4o事件来检测对象何时被存储、激活等。在这样的事件侦听器中,您可以使用当前的Autofac作用域来传递其他服务

顺便说一句,db4o已经调用了IActivatable::Bind()这个东西。你不需要做任何其他事情


一般来说,我会尝试正确地确定所有内容的范围,而不是将Autofac误用为服务定位器。

我建议用Autofac实例化替换每一个“新的”。我的经验法则是,当一个对象需要复杂的依赖项(不是简单的集合、核心CLR类型、其他简单对象)时,我会让Autofac来完成这项工作。简单的域对象我通常只使用新操作符或创建工厂

我不能百分之百肯定你的问题是否正确。您想在实例化域模型时将某些服务绑定到它们吗?那么我建议使用。您可以使用db4o事件来检测对象何时被存储、激活等。在这样的事件侦听器中,您可以使用当前的Autofac作用域来传递其他服务

顺便说一句,db4o已经调用了IActivatable::Bind()这个东西。你不需要做任何其他事情


一般来说,我会尝试正确地确定所有内容的范围,而不是将Autofac误用为服务定位程序。

感谢您向我介绍活动,我会看一看。正如我在问题中指出的,我遇到的问题不是提交部分。这是加载部分,我有问题。如果我什么也不做,只是使用TA,那么我将有一些对象加载到内存中,而这些对象没有在autofac中注册。我知道加载时db4o会调用IActivatable::Bind(),这就是为什么我希望将其用作向autofac注册对象的机会。正如我还提到的,我希望避免使用autofac作为服务定位器。查看事件注册表API,我发现有一个激活的事件。更好的是,这与Nick提出的域事件概念非常吻合。看起来我仍然需要将autofac IContainer提供给激活的处理程序。从好的方面来说,这看起来比我的每个域对象的代码都要简单。谢谢你给我指点事件,我来看看。正如我在问题中指出的,我遇到的问题不是提交部分。这是加载部分,我有问题。如果我什么也不做,只是使用TA,那么我将有一些对象加载到内存中,而这些对象没有在autofac中注册。我知道加载时db4o会调用IActivatable::Bind(),这就是为什么我希望将其用作向autofac注册对象的机会。正如我还提到的,我希望避免使用autofac作为服务定位器。查看事件注册表API,我发现有一个激活的事件。更好的是,这与Nick提出的域事件概念非常吻合。看起来我仍然需要将autofac IContainer提供给激活的处理程序。从好的方面看,这看起来不那么繁重