Dependency injection 如何在Orchard中注册自定义生成的Autofac.模块?

Dependency injection 如何在Orchard中注册自定义生成的Autofac.模块?,dependency-injection,orchardcms,autofac,Dependency Injection,Orchardcms,Autofac,我有一段代码封装了非Orchard特有的功能。然而,我需要通过依赖注入使它在Orchard中可用。所以,我建立了一个Autofac模块来注册所有组件(类型),但我找不到一种方法来通知Orchard的Autofac容器 根据我的介绍,有两种方法可以将模块添加到容器中: 通过向集装箱造船厂(通常在启动时)提供模块, 或者在运行时使用ContainerBuilder更新已构建的容器 我可以用第一种方法解决这个问题,但是如果有这样的问题,我宁愿使用第二种方法的变体?只需将一个从Autofac.Modul

我有一段代码封装了非Orchard特有的功能。然而,我需要通过依赖注入使它在Orchard中可用。所以,我建立了一个Autofac模块来注册所有组件(类型),但我找不到一种方法来通知Orchard的Autofac容器

根据我的介绍,有两种方法可以将模块添加到容器中:

通过向集装箱造船厂(通常在启动时)提供模块, 或者在运行时使用ContainerBuilder更新已构建的容器


我可以用第一种方法解决这个问题,但是如果有这样的问题,我宁愿使用第二种方法的变体?

只需将一个从
Autofac.Module
派生的类添加到您的Orchard模块中即可。在集装箱建造过程中,果园会自动将其采摘。

基本正确,但这里有一些更详细的信息:

您的Orchard模块是您添加到Orchard.sln的新.csproj 添加Autofac作为该csproj的参考(确保使用Orchard附带的版本,而不是nuget。) 然后添加一个从Autofac.Module派生并实现Load(ContainerBuilder)的类。 e、 g

使用系统;
使用Autofac;
命名空间MyCustom.Module.namespace
{
公共类装入器模块:Autofac.Module
{
受保护的覆盖无效负载(ContainerBuilder builder)
{
builder.RegisterType().As();
}
}
}
作为补充说明: Autofac注册码仅在应用程序启动时调用。 如果您运行的站点位于IIS中,代码位于VS中,那么Orcahrd的动态编译特性意味着当您重新编译代码时,应用程序不会停止


因此,为了命中此Autofac注册码(以及使其任何更改生效),您必须将iisreset设置为终止应用程序,以便它重新加载Autofac注册。

我相信我已经这样做了-我已将其添加到我的Orchard模块(即.csproj)中一个公共类LoaderModule:Autofac.Module,它实现了受保护的覆盖无效加载(ContainerBuilder builder),但其代码在任何时候都不会被调用。编辑:已解决-请参阅下面的完整答案。@Piotr感谢您的回答,您能否澄清orchard是如何自动选择模块的?因为我看不到任何类似
RegisterAssemblyModule()
或手动程序集扫描的内容。@BehnamEsmaili整个容器创建魔法发生在
ShellContainerFactory
类中。这比仅仅调用registerasemblymodules()要复杂得多-有一个手动程序集扫描,尽管它非常间接(通过
ShellBlueprint
)。
using System;
using Autofac;

namespace MyCustom.Module.Namespace
{
  public class LoaderModule : Autofac.Module
  {
    protected override void Load(ContainerBuilder builder)
    {
      builder.RegisterType<MyClass>().As<IMyInterface>();
    }
  }
}