Castle Windsor でコンポーネントをセットアップするために xml 構成を使用しています。私はこの設定を持っています:
<component id="SurescriptsDatabase"
service="System.Data.IDbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"
type="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" lifestyle="transient">
<parameters>
<connectionString>REDACTED1</connectionString>
</parameters>
</component>
<component id="Surescriptsv10Database"
service="System.Data.IDbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"
type="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" lifestyle="transient">
<parameters>
<connectionString>REDACTED2</connectionString>
</parameters>
</component>
<component id="Surescriptsv10StagingDatabase"
service="System.Data.IDbConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"
type="System.Data.SqlClient.SqlConnection, System.Data, Version=4.0.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089" lifestyle="transient">
<parameters>
<connectionString>REDACTED3</connectionString>
</parameters>
</component>
<component id="SurescriptsWatcher"
type="PatientFirst.Framework.Services.ScalarQueryWatcher, PatientFirst.Framework.Services">
<parameters>
<Database>${SurescriptsDatabase}</Database>
<Frequency>0.00:01:00</Frequency>
<CustomMessage>Surescripts v6 is not running</CustomMessage>
<Query>select count(1) from [SureScripts_Production].[dbo].[ToSureScriptMessagesQueue] where requesttime < dateadd(minute,-1,getdate()) and responsetime is null</Query>
<MinResult>-1</MinResult>
<MaxResult>0</MaxResult>
</parameters>
</component>
<component id="Surescriptsv10Watcher" type="PatientFirst.Framework.Services.ScalarQueryWatcher, PatientFirst.Framework.Services">
<parameters>
<Database>${Surescriptsv10Database}</Database>
<Frequency>0.00:01:00</Frequency>
<CustomMessage>Surescripts v10 is not running</CustomMessage>
<Query>select count(1) from [SureScripts_v10_Production].[dbo].[ToSureScriptMessagesQueue] where requesttime < dateadd(minute,-1,getdate()) and responsetime is null</Query>
<MinResult>-1</MinResult>
<MaxResult>0</MaxResult>
</parameters>
</component>
<component id="Surescriptsv10StagingWatcher" type="PatientFirst.Framework.Services.ScalarQueryWatcher, PatientFirst.Framework.Services">
<parameters>
<Database>${Surescriptsv10StagingDatabase}</Database>
<Frequency>0.00:01:00</Frequency>
<CustomMessage>Surescripts v10 Staging is not running</CustomMessage>
<Query>select count(1) from [SureScripts_v10_Staging].[dbo].[ToSureScriptMessagesQueue] where requesttime < dateadd(minute,-1,getdate()) and responsetime is null</Query>
<MinResult>-1</MinResult>
<MaxResult>0</MaxResult>
</parameters>
</component>
私の ScalarQueryWatcher のコンストラクターでは、常に同じデータベース接続が注入されています。SQLConections のコンポーネント定義の service= 部分を削除すると、Windsor は次のように文句を言います。
Castle.MicroKernel.Handlers.HandlerException: コンポーネント >'serviceBootstrapper' を作成できません。満たすべき依存関係があるためです。
「SurescriptsWatcher」は次の依存関係を待機しています: - 登録されていないサービス「System.Data.IDbConnection」。- コンポーネント 'Surescriptsv10Watcher' (オーバーライド経由) は登録されましたが、依存関係を待機しています。
「Surescriptsv10Watcher」は次の依存関係を待機しています: - 登録されていないサービス「System.Data.IDbConnection」。- コンポーネント 'Surescriptsv10StagingWatcher' (オーバーライド経由) は登録されましたが、依存関係も待機しています。
「Surescriptsv10StagingWatcher」は次の依存関係を待機しています: - 登録されていないサービス「System.Data.IDbConnection」。
ここで何が間違っていますか?ドキュメントを読ん<Database>${SurescriptsDatabase}</Database>
で、コンポーネントのIDを使用して指定すると、その特定のコンポーネントが得られると思いました。
更新これを以前に行うことを意味しました。ここでは、後で後世に行きます。問題は XML 構成内ではなく、ソース コード内にありました。
パブリック クラス ScalarQueryWatcher
Public Sub New(ByVal Query As String,
ByVal Connection As IDbConnection,
ByVal Frequency As TimeSpan,
ByVal MinResult As Integer, ByVal MaxResult As Integer)
_database = Connection
'this should get the table we're querying from
If String.IsNullOrEmpty(Query) Then Throw New ApplicationException("Query cannot be null")
_queryName = Query.Substring(Query.IndexOf("FROM", StringComparison.CurrentCultureIgnoreCase) + 5)
If _queryName.Contains(" ") Then _queryName = _queryName.Substring(0, _queryName.IndexOf(" "))
_query = Query
_frequency = Frequency
_minResult = MinResult
_maxResult = MaxResult
_range = _maxResult - _minResult
End Sub