我有一段代码封装了非特定于Orchard的功能。但是我需要通过依赖注入使它在Orchard中可用。所以,我建立了一个注册所有组件(类型)的Autofac模块,但我找不到通知Orchard的Autofac Container的方法。
从红色开始,有两种方法可以将模块添加到容器中:
通过向ContainerBuilder提供模块(通常在启动时), 或者通过使用ContainerBuilder
在运行时更新已构建的Container我可以用第一种方式解决问题,但是如果有这样的话,我宁愿做第二种变体吗?
答案 0 :(得分:2)
只需将一个派生自Autofac.Module
的类添加到您的Orchard模块即可。它将在集装箱建造过程中自动被Orchard挑选。
答案 1 :(得分:1)
Piotr Szmyd's answer基本上是正确的,但这里有一些更详细的信息:
您的Orchard模块是您添加到Orchard.sln的新.csproj 添加Autofac作为对该csproj的引用(确保使用Orchard附带的版本 - 而不是nuget。See here for more details about that problem) 然后添加一个派生自Autofac.Module并实现Load(ContainerBuilder)的类。 e.g。
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注册。