2

いくつかのコントローラーを含む WebApi アプリケーションがあります (拡張メソッド RegisterApiControllers を使用して登録されます)。このアプリケーションは、公開したくない他のコントローラーを含む別のアセンブリを参照しています (コンテナーに登録されていないことを確認しました)。両方に OrderController があり、/api/Order URL にアクセスしようとすると、「'order' という名前のコントローラーに一致する複数の型が見つかりました」という例外が発生します。スタック トレースは、私が DefaultHttpControllerSelector にいたことを示しています。

以前は AutofacControllerFactory が存在し、それを登録した ConfigureWebApi さえありましたが、デフォルト ブランチにはもう存在しません (ここで確認できますhttp://alexmg.com/post/2012/03/09 /Autofac-ASPNET-Web-API-(ベータ) -Integration.aspx )

また、WebApi ではルート定義の名前空間をフィルタリングできないようです (MVC で可能)。

Autofac コンテナーに登録されているコントローラーのみを使用し、参照されているすべてのアセンブリをスキャンしてコントローラーを検出するように見える DefaultHttpControllerSelector を使用しない方法についてのアイデアはありますか?

ありがとう

4

1 に答える 1

3

問題は、コントローラを autofac に登録することは、実際にはルーティング プロセスとは関係がないことです。ルーティング プロセスがディスパッチ先のコントローラーを特定した場合にのみ、型を解決するために Autofac が呼び出されます。ソースを掘り下げるIHttpControllerSelectorと、同じ名前の 2 つのコントローラーを処理するには、代わりのコントローラーを作成する必要があるようです。(これは本当に最悪です)。を、無視するアセンブリからコントローラーを除外する述語を渡されるインスタンスに
置き換えることができる場合があります。DefaultHttpControllerTypeResolverそれは少し厄介な解決策ですが、うまくいくかもしれません。

実際には、DefaultHttpControllerTypeResolver を Autofac コンテナーの登録に基づくものに完全に置き換えることができる場合があります。これは非常にシンプルなインターフェイスであるため、Autofac に何らかの検出メカニズムが備わっている限り、成功するはずです。

   public interface IHttpControllerTypeResolver
    {
      ICollection<Type> GetControllerTypes(IAssembliesResolver assembliesResolver);
    }
于 2013-05-07T16:00:29.570 に答える