Dependency injection Autofac容器独立性和关系类型

Dependency injection Autofac容器独立性和关系类型,dependency-injection,ioc-container,autofac,Dependency Injection,Ioc Container,Autofac,我们目前正在使用Autofac作为我们选择的IoC容器。我们的可重用程序集中的所有应用程序代码都必须尽可能保持干净,因此我们不希望核心应用程序中存在对Autofac的任何直接依赖。唯一允许使用Autofac的地方是在组件根/引导程序中,在那里注册和连接组件。应用程序依赖依赖依赖项注入来创建所需的对象图 由于我们保持核心应用程序容器的不可知性,这意味着我们不能在核心应用程序中使用Autofac关系类型,例如Owned 我想创建一个工厂,返回实现IDisposable的组件。当Autofac跟踪一次

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

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

我想创建一个工厂,返回实现
IDisposable
的组件。当Autofac跟踪一次性对象时,我相信我必须使用一个生命周期范围来创建一个定义的工作单元,在这个工作单元中,组件一旦超出范围就会被处置

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

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

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

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

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

这方面最好的“现实”例子可能是Autofac MVC集成机制。虽然它不在封面下使用
Func
,但它确实向您展示了如何实现一种非Autofac特定的机制,以便在封面下与Autofac对话

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

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