2012-05-14 16 views
2

.NET 3.5から.NET 4へのソリューションをアップグレードしました 同時に、Castleを2.5からアップグレードするように、すべての外部ライブラリを最新バージョンにアップグレードしました。Castle 3.0にアップグレードした後でComponentResolutionExceptionが発生しました

[Castle.MicroKernel.ComponentResolutionException] { "のため スコープを取得できませんでした:私は私が解決しようとすると、今の例外をスローDBアクセスを登録するいくつかのコードをしましたV3.0

から2コンポーネントDF.MailFlowAdapter。これはおそらく、カスタムIScopeAccessorの バグ、または

Container 
    .AddFacility<WcfFacility>() 
    .AddFacility<DataAccessAdapterFacility>() 
    .Register(Component 
     .For<SD.LLBLGen.Pro.ORMSupportClasses.IDataAccessAdapter>() 
     .ImplementedBy<MailFlowAdapter>() 
     .LifeStyle.PerWcfOperation()) 
:アクセスコンポーネントが、この方法で登録されている

"} Castle.MicroKernel.ComponentResolutionException(ウェブ要求 等の当たりウェブリクエスト成分 外等)範囲外 成分スコープ

問題はPerWcfOperation LifeStyleに由来しますが、理由はわかりません。プロジェクトはWCFプロジェクトであり、WCFメソッドを呼び出すときにコンポーネントが解決されます。 この登録は、Castle 2.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を使用したeはFactoryを使用して単純化することができますが、ここでは問題にはなりません:)

なぜPerWcfOperationライフスタイルを使用できないのか考えている人はいますか?

答えて

0

もOKですが、城のメーリングリスト上のクレイグノイヴィルトと私の議論を再開してみましょう:

  • 行動がV2.5には、変更されている 過渡的なライフスタイルにフォールバックされました。しかし、それは一貫していなかったので( コンポーネントがPerWcfOperationであったときと、それがTransientのときの情報はありませんでした)、これは が削除されました。
  • それはあなたがハイブリッドライフスタイルがcastlecontribプロジェクト

    で行われている方法を読んだ後、それは些細だと私はここに私のコードを投稿していないだろう、カスタムライフスタイル・スコープ・アクセサ

を使用して同じ操作を行うことが可能です

1

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

関連する問題