2011-05-30 88 views
14

在与同事讨论Autofac时,出现了依赖关系的运行时注册问题。例如,在Prism中,程序集经常在运行时加载,并且它们的依赖关系在IoC容器(通常是Unity)中注册。与Autofac的运行时注册

这怎么能用Autofac完成?

从Autofac的文档以及我在网上找到的内容来看,似乎注册是在应用程序启动时执行的。即使使用“外部”程序集,注册也位于程序集启动时的程序集模块中。在应用程序启动时“创建”容器后,我们如何做到这一点? (请注意,程序集可能希望为应用程序中的其他组件添加依赖项,因此嵌套容器可能无法解决此问题。与此主题相关:Unity具有诸如RegisterIfExists之类的方法。是否有Autofac等效物?)

谢谢!

+0

[Autofac,在创建容器后添加服务]的可能重复(http://stackoverflow.com/questions/4998870/autofac-adding-services-after-container-has-been-built) – 2013-06-06 15:39:42

回答

29

更新现有的Autofac容器:您可以使用ContainerBuilder.Update()在运行时更新现有的Autofac Container。下面的代码示例,从博客文章Autofac 2.2 Released拍摄,展示了用法:

var container = // something already built 

var updater = new ContainerBuilder(); 
updater.RegisterType<A>(); 
updater.Register(c => new B()).As<IB>(); 

// Add the registrations to the container 
updater.Update(container); 

Autofac和棱镜整合:这个问题Whats the status of Prism integration in Autofac?也可能对你有用。

+0

你知道吗如果可以使用动态加载的程序集中的类型来做到这一点?也就是说,我使用'Assembly.LoadFrom()'然后用新发现的类型更新容器? – 2015-02-05 16:26:30

+0

其中一个'RegisterType'重载需要一个'Type'实例,所以如果你有这个,你应该很好去。 – bentayloruk 2015-02-07 16:37:43

+0

'Update()'命令只能使用一次。这对于运行时注册而言效率不高。如果可能,我需要在'.Build()'操作后注册新类型... – 2016-10-03 20:50:25