2

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

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

我想创建一个工厂来返回实现IDisposable. 由于 Autofac 跟踪一次性对象,我相信我必须使用生命周期范围来创建定义的工作单元,一旦超出范围,组件将在其中被释放。

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

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

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

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

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

4

1 回答 1

1

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

在 MVC 的情况下,System.Web.Mvc.IDependencyResolver是接口,Autofac.Integration.Mvc.AutofacDependencyResolver是实现。System.Web.Mvc.DependencyResolver.Current当 ASP.NET MVC 请求一个服务时,它会从IDependencyResolver. 在应用程序启动时,该单例被设置为 Autofac 实现。

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

于 2013-01-14T17:00:23.507 回答