4

我有一个使用 ASP.NET MVC 4、WebAPI 和其他一些组件构建的分层 Web 应用程序。我使用最新版本的 Autofac 2.6.2.859 作为我的 DI 容器以及 MVC 和 WebAPI 集成。我在不同的层中设置了 autofac 模块,并且正在使用新的 RegisterAssemblyModules 来扫描 AppDomain 程序集以查找各种模块。

在启动时,一切都很好。当我编辑 web.config 文件并且应用程序预热时,我的注册丢失了。我得到一个 DependencyResolutionException -

在“My.Class.Name”类型上使用“公共绑定标志”找到的任何构造函数都不能使用可用的服务和参数调用:

所以我的注册没有被重新加载。有谁知道如何解决这个问题?我应该将初始化代码放在 Application_Start() 以外的其他地方吗?

更新

这是我的代码的样子

 public static class IoC
{
    public static void Configure()
    {
        var builder = new ContainerBuilder();
        var assemblies = AppDomain.CurrentDomain.GetAssemblies();

        //Assembly Modules            
        builder.RegisterAssemblyModules<NSUTriviaModuleBase>(assemblies);

        // Register API controllers using assembly scanning.
        builder.RegisterControllers(assemblies);

        // Register API controllers using assembly scanning.
        builder.RegisterApiControllers(assemblies);

        var container = builder.Build();
        // Set the dependency resolver implementation.
        var resolver = new AutofacWebApiDependencyResolver(container);

        GlobalConfiguration.Configuration.DependencyResolver = resolver;
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}
4

1 回答 1

9

我认为问题在于应用程序首次启动时所有程序集都加载到 AppDomain 中,但是当 IIS 回收 AppDomain 时,程序集仅按需加载。

尝试使用GetReferencedAssemblieson 方法System.Web.Compilation.BuildManager来获取引用程序集的列表。

var assemblies = BuildManager.GetReferencedAssemblies().Cast<Assembly>();

这应该会强制将引用的程序集立即加载到 AppDomain 中,从而使它们可用于模块扫描。

于 2012-06-20T08:03:59.283 回答