1

我有一段代码封装了并非特定于 Orchard 的功能。但是我需要通过依赖注入使其在 Orchard 中可用。因此,我建立了一个注册所有组件(类型)的 Autofac 模块,但我找不到通知 Orchard 的 Autofac Container 的方法。

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

通过向 ContainerBuilder 提供模块(通常在启动时),或者通过在运行时使用 ContainerBuilder 更新已经构建的 Container

我可以用第一种方式解决问题,但如果有的话,我宁愿做第二种方式的变体?

4

2 回答 2

2

只需将派生自的类添加Autofac.Module到您的 Orchard 模块即可。它会在容器构建过程中被 Orchard 自动拾取。

于 2012-12-07T22:08:27.740 回答
1

Piotr Szmyd 的回答基本上是正确的,但这里有一些更详细的信息:

您的 Orchard 模块是您添加到 Orchard.sln 的新 .csproj 添加 Autofac 作为对该 csproj 的引用(确保您使用 Orchard 附带的版本 - 而不是 nuget。有关该问题的更多详细信息,请参见此处)然后添加一个派生自 Autofac.Module 并实现 Load(ContainerBuilder) 的类。例如

using System;
using Autofac;

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

作为附加说明:Autofac 注册代码仅在应用程序启动时被调用。如果您在 IIS 中本地运行站点并在 VS 中运行代码,那么 Orcahrd 的动态编译特性意味着当您重新编译代码时,应用程序不会停止。

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

于 2015-02-25T11:15:43.653 回答