2

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 &lt; 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 &lt; 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 &lt; 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
4

1 に答える 1

1

コンストラクターのパラメーター名は、xml 構成で参照したデータベースではなく、接続であることに注意してください。これが、サービス タイプが指定されたときに「機能した」理由であり、IDbConnection に一致するものは何でも取得します。正しいコンストラクタ パラメータ名を使用し始めたとき、ID で指定したデータベースを取得しました。

Public Sub New(ByVal Query As String,
 ByVal Connection As IDbConnection,         'Note the name here is Connection
 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

  <component id="SurescriptsWatcher" 
             type="PatientFirst.Framework.Services.ScalarQueryWatcher, PatientFirst.Framework.Services">
    <parameters>
      <Database>${SurescriptsDatabase}</Database>  <!--note the parameter here is database, which does not match the constructor parameter -->
      <Frequency>0.00:01:00</Frequency>
      <CustomMessage>Surescripts v6 is not running</CustomMessage>
      <Query>select count(1) from [SureScripts_Production].[dbo].[ToSureScriptMessagesQueue] where requesttime &lt; dateadd(minute,-1,getdate()) and responsetime is null</Query>
      <MinResult>-1</MinResult>
      <MaxResult>0</MaxResult>
    </parameters>
  </component>
于 2014-02-12T15:24:54.730 に答える