4

ASP.NET MVC 4、WebAPI、およびその他のコンポーネントを使用して構築したレイヤード Web アプリケーションがあります。MVC と WebAPI の統合と共に、Autofac 2.6.2.859 の最新リリースを DI コンテナーとして使用しています。さまざまなレイヤーに autofac モジュールをセットアップしており、新しい RegisterAssemblyModules を使用して、さまざまなモジュールの AppDomain アセンブリをスキャンしています。

起動時に、すべてがうまく機能します。web.config ファイルを編集してアプリケーションがウォームアップすると、登録が失われます。DependencyResolutionException を取得します -

タイプ 'My.Class.Name' の 'Public binding flags' で見つかったコンストラクターは、利用可能なサービスとパラメーターで呼び出すことができません。

したがって、私の登録はリロードされていません。この問題に対処する方法を知っている人はいますか? 初期化コードを 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に読み込まれることですが、AppDomainがIISによってリサイクルされると、アセンブリはオンデマンドでのみ読み込まれます。

GetReferencedAssemblies代わりに、上のメソッドを使用してSystem.Web.Compilation.BuildManager、参照されているアセンブリのリストを取得してみてください。

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

これにより、参照されるアセンブリがAppDomainにロードされ、モジュールスキャンですぐに使用できるようになります。

于 2012-06-20T08:03:59.283 に答える