ソリューションを.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ライフスタイルを使用できないのか誰かが考えていますか?