Autofac容器独立性和关系类型

时间:2013-01-12 23:46:29

标签: dependency-injection ioc-container autofac

我们目前正在使用Autofac作为我们选择的IoC容器。我们的可重用程序集中的所有应用程序代码必须尽可能保持干净,因此我们不希望在我们的核心应用程序中直接依赖Autofac。允许Autofac的唯一位置是组合root / bootstrappers,其中组件已注册并连接。应用程序依赖依赖注入来创建所需的对象图。

由于我们保持核心应用程序容器不可知,这意味着我们不能在我们的核心应用程序中使用Autofac关系类型,例如Owned

我想创建一个返回实现IDisposable的组件的工厂。由于Autofac跟踪一次性对象,我认为我必须使用生命周期范围来创建一个已定义的工作单元,一旦它们超出范围,组件就会被处理掉。

根据Autofac文档,这可以通过依赖Func<Owned<T>>来实现,但是,如上所述,我不能依赖Owned,因为它是Autofac类型。在this页面的底部,显示

  

Autofac中的自定义关系类型不会强制您将应用程序更紧密地绑定到Autofac。它们为您提供了容器配置的编程模型,这与您编写其他组件的方式一致(与必须知道许多特定的容器扩展点和可能集中配置的API相比。)

     

例如,您仍然可以在核心模型中创建自定义ITaskFactory,但如果需要,则提供基于Func<Owned<T>>的AutofacTaskFactory实现。

我认为我需要实现ITaskFactory的这种实现,但我找不到任何示例。

如果有人能提供这样的例子,我将非常感激。

1 个答案:

答案 0 :(得分:1)

可能最好的“真实世界”示例是Autofac MVC集成机制。虽然它没有使用Func<Owned<T>>,但它确实向您展示了如何实现非Autofac特定的机制来与Autofac进行对话。

在MVC案例中,System.Web.Mvc.IDependencyResolver是接口,Autofac.Integration.Mvc.AutofacDependencyResolver是实现。当ASP.NET MVC请求服务时,它从System.Web.Mvc.DependencyResolver.Current获取它,返回IDependencyResolver。在应用启动时,该单例将设置为Autofac实现。

同样的原则适用于您的定制工厂。虽然IDependencyResolver并不特定于它返回的类型(它只是GetService<T>()),但您可以轻松地编写特定于类型的工厂界面。