2

afBedSheet のドキュメントには、「フィルターを使用して、承認などの横断的な問題に対処できる」と記載されています。次のコード スニペットを示します。

@Contribute { serviceType=HttpPipeline# }
static Void contributeHttpPipeline(OrderedConfig conf, AuthFilter myAuthFilter) {
  conf.addOrdered("AuthFilter", myAuthFilter, ["after: BedSheetFilters"])
}

AuthFilter を実装しようとしています (現在はダミーですが、実際の AuthFilter に進化させる必要があります) が、動作させることができません:

using afBedSheet

const mixin AuthFilter : HttpPipelineFilter { }

internal const class AuthFilterImpl : AuthFilter {

    internal new make(|This|in) { in(this) }

    override Bool service(HttpPipeline handler) {
        echo("Dummy AuthFilter invoked!")
        return handler.service
    }
}

プロジェクトを正常にビルドできますが、プロジェクトを実行して HTTP サービスを呼び出すと、以下のエラーが発生します。AuthFilter をafIocサービスとして宣言するか、注釈を付ける必要があると思いますが、場所や方法がわかりません。誰か教えてください。

スレッド ローカル:
  ThreadStash.01.BedSheetModule.0017.perThreadState: fan.afIoc.ModuleServices@1ab5e0b
  ThreadStash.01.HttpRequest.0001.headers: fan.afBedSheet.HttpRequestHeaders@1ab6087
  afIoc::ThreadStash.counter: 13
  web.req: fan.wisp.WispReq@4e62cc
  web.res: fan.wisp.WispRes@387bc2
  web.session: 060f9951-41f1-e500-0fc2-0019b971d079
[05:27:18 05-Nov-13] [err] [web] 内部エラー処理: /info
  afIoc::IocErr: タイプ mt::AuthFilter に一致する依存関係がありません。
Ioc 操作トレース:
  [ 1] タイプ 'afBedSheet::HttpPipeline' による依存関係の特定
  [2] REAL サービス「HttpPipeline」の作成
  [ 3] ビルダー メソッド「afBedSheet::BedSheetModule.buildHttpPipeline」によるサービス「HttpPipeline」の作成
  [ 4] afBedSheet::HttpPipeline buildHttpPipeline(afBedSheet::HttpPipelineFilter[] フィルター、afIoc::PipelineBuilder bob、afIoc::Registry reg) の注入パラメーターの決定
  [ 5] タイプ afBedSheet::HttpPipelineFilter[] の依存関係を探しています
  [ 6] タイプ afBedSheet::HttpPipelineFilter[] の ORDERED 構成の収集
  [ 7] sys::Void のインジェクション パラメータの決定contributHttpPipeline(afIoc::OrderedConfig conf, mt::AuthFilter
myAuthFilter)
  [ 8] mt::AuthFilter 型の依存関係を探す
スタックトレース:
    afIoc::Utils.stackTraceFilter (Utils.fan:63)
    afIoc::RegistryImpl.dependencyByType (RegistryImpl.fan:243)
    afBedSheet::BedSheetWebMod.onService (BedSheetWebMod.fan:34)
    wisp::WispActor.doService (WispActor.fan:197)
    wisp::WispActor.process (WispActor.fan:78)
    wisp::WispActor.receive (WispActor.fan:48)
    並行::Actor._dispatch (Actor.java:228)
    並行::Actor._work (Actor.java:199)
    並行::ThreadPool$Worker.run (ThreadPool.java:255)
4

1 に答える 1

1

AuthFilterサービスとして宣言する必要はありません。contribut() メソッドでインスタンスを新しく作成できます。

@Contribute { serviceType=HttpPipeline# }
static Void contributeHttpPipeline(OrderedConfig conf) {

    authFilter := AuthFilterImpl()

    conf.addOrdered("AuthFilter", authFilter, ["after: BedSheetFilters"])
}

他のサービスに依存している場合AuthFilter(たとえば、 で注釈が付けられたフィールドがある場合@Inject)、afIocはインスタンスを構築する必要があります。OrderedConfigandオブジェクトには、このためMappedConfigの便利なautobuild()メソッドがあります。

    authFilter := conf.autobuild(AuthFilterImpl#)

他のサービスに注入されたい場合AuthFilter、またはそれに貢献したい場合は、afIocサービスとして定義する必要があります。これを行うには、 のbind()メソッドを使用します。AppModule

static Void bind(ServiceBinder binder) {
    binder.bind(AuthFilter#, AuthFilterImpl#)
}

次に、例のように、contribut メソッドに挿入されたパラメーターである可能性があります。

@Contribute { serviceType=HttpPipeline# }
static Void contributeHttpPipeline(OrderedConfig conf, AuthFilter authFilter) {

    conf.addOrdered("AuthFilter", authFilter, ["after: BedSheetFilters"])
}

詳細については、 afIoc - 定義サービスを参照してください。BedSheetModuleも、さまざまな例の参考になるかもしれません。

于 2013-11-04T20:17:48.517 に答える