1

別のプロジェクトに単純な ApiController があります。

<Export("Custom", GetType(ApiController)),
PartCreationPolicy(CreationPolicy.NonShared)>
Public Class CustomController
    Inherits ApiController

    Public Function GetSomething() As HttpResponseMessage
        Dim Result As New Something() With {
             .Code = "Code",
             .SomeField = "Something",
             .SomeField2 = 5
            }
        Return Request.CreateResponse(System.Net.HttpStatusCode.OK, Result)
    End Function

End Class

しばらくグーグルで調べた後、IHttpControllerSelector と IHttpControllerActivator のカスタム実装を使用してコントローラーが解決されるようになりました。しかし、今は Error: を取得しています"No action was found on the controller 'Custom' that matches the name 'GetSomething'"。IHttpActionSelector を実装する必要があることを意味し、おそらくその後何か他のものを実装する必要があります...カスタム処理を実行しようとしていないため、これは非常に複雑で非論理的に聞こえます。私が間違っているヒントはありますか?

4

1 に答える 1

2

外部ライブラリに WebAPI コントローラーを配置するのは、非常に簡単に思えます。必要なのは、カスタム AssembliesResolver を登録することだけです。Mef 登録は、既に外部 dll をロードしていました。

トリックは、DefaultAssembliesResolver とオーバーライド関数 GetAssemblies() を使用できないことです。自分で IAssembliesResolver を実装する必要があります。

これが私が必要としていたものを正確に与えた私のコードです:

Mef 登録 (拡張機能が読み込まれる部分のみ):

    Dim ExtensionsCatalog As New DirectoryCatalog(Settings.GetValue("ExtensionsFolder"))
    Dim container As New CompositionContainer(ExtensionsCatalog, defaultCatalogEP)

Global.asax

GlobalConfiguration.Configuration.Services.Replace(GetType(IAssembliesResolver), New Models.CustomAssembliesResolver())

CustomAssembliesResolver クラス

    Public Class CustomAssembliesResolver
    Implements IAssembliesResolver

    Public Function GetAssemblies() As ICollection(Of Assembly) Implements IAssembliesResolver.GetAssemblies
        Dim assemblies As List(Of Assembly) = AppDomain.CurrentDomain.GetAssemblies().ToList()
        Return assemblies
    End Function

End Class

そして今、私は新しいコントローラーを「自動的に追加」し、MEF を使用して基本 WebAPI をオーバーライド/拡張​​しています。

于 2013-05-20T10:08:07.013 に答える