2

ソリューションを.NET3.5から.NET4にアップグレードしました。同時に、すべての外部ライブラリを最新バージョンにアップグレードしたため、Castleが2.5.2からv3.0にアップグレードされました。

解決しようとすると例外をスローするdbアクセスを登録するコードがいくつかあります。

[Castle.MicroKernel.ComponentResolutionException] {"コンポーネントDF.MailFlowAdapterのスコープを取得できませんでした。これは、カスタムIScopeAccessorのバグであるか、スコープ外のスコープコンポーネントにアクセスしようとしている可能性があります(Webリクエストごとなど)。 Webリクエスト外のコンポーネントなど) "} Castle.MicroKernel.ComponentResolutionException

コンポーネントは次のように登録されます。

Container
    .AddFacility<WcfFacility>()
    .AddFacility<DataAccessAdapterFacility>()
    .Register(Component
        .For<SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter>()
        .ImplementedBy<MailFlowAdapter>()
        .LifeStyle.PerWcfOperation())

問題はPerWcfOperationLifeStyleに起因しますが、理由はわかりません。プロジェクトはWCFプロジェクトであり、WCFメソッドを呼び出すとコンポーネントが解決されます。この登録は、Castle2.5を使用するブランチで正常に機能しています。

IDataAccessAdapterを解決するため(dbでlogin / pwdをチェックするため)、wcf login / pwdを検証するときに(UserNamePasswordValidatorを使用するIAuthorizationPolicyで)例外がスローされます。

その他の情報:

DataAccessAdapterFacilityは、コンポーネントアクティベーターを登録する古いコードです。model.Serviceがmodel.Servicesに変更されたため、コードを少し変更する必要がありました。

void Kernel_ComponentModelCreated(ComponentModel model)
{
    foreach (var service in model.Services)
    {
        if (service == typeof(SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter))
        {
            model.CustomComponentActivator = typeof(DataAccessAdapterActivator);
        }
    }
}

また、DataAccessAdapterActivatorは、構成ファイルの接続文字列を使用してオブジェクトを作成する役割を果たします。

protected override object InternalCreate(CreationContext context)
{
    var connectionString = string.Empty;
    if (ConfigurationManager.ConnectionStrings["Main"] != null)
        connectionString = ConfigurationManager.ConnectionStrings["Main"].ConnectionString;
    return new MailFlowAdapter(connectionString);
}

DataAccessAdapterFacility / DataAccessAdapterActivatorを使用したコードは、Factoryを使用して簡略化できると思いますが、ここでの質問ではありません:)

それで、なぜ私がPerWcfOperationライフスタイルを使用できないのか誰かが考えていますか?

4

2 に答える 2

1

カスタムUserNamePasswordValidatorが呼び出された時点でOperationContext.Currentが使用可能であるとは思いません。そのコンポーネントに別のライフスタイルを使用することは可能ですか?

于 2012-05-17T15:05:32.993 に答える
0

さて、城のメーリングリストでCraigNeuwirtとの話し合いを再開しましょう。

  • 動作が変更され、v2.5では一時的なライフスタイルにフォールバックしていました。ただし、一貫性がなかったため(コンポーネントがPerWcfOperationであった場合と、一時的であった場合に関する情報はありません)、これは削除されました。
  • カスタムライフスタイルスコープアクセサーを使用して同じことを行うことが可能です

Castlecontribプロジェクトでハイブリッドライフスタイルがどのように行われるかを読んだら、コードは簡単なので、ここには投稿しません。

于 2012-05-19T07:22:53.623 に答える