Замок Виндзор использует неправильный компонент для удовлетворения зависимости - PullRequest
0 голосов
/ 09 июня 2010

У меня есть следующее сопоставление компонентов в Windsor xml:

<component
  id="dataSession.DbConnection"
  service="System.Data.IDbConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  type="System.Data.SqlClient.SqlConnection, System.Data, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"
  lifestyle="custom"
  customLifestyleType="MyCompany.Castle.PerOperationLifestyle.PerOperationLifestyleManager, MyCompany.Castle">
  <parameters>
    <connectionString>server=(local);database=MyCompany;trusted_connection=true;application name=OperationScopeTest;</connectionString>
  </parameters>
</component>

<component
  id="dataSession.DataContext"
  service="System.Data.Linq.DataContext, System.Data.Linq, Version=3.5.0.0, Culture=neutral, PublicKeyToken=B77A5C561934E089"
  type="MyCompany.BusinessLogic.MyCompanyDataContext, MyCompany.BusinessLogic"
  lifestyle="custom"
  customLifestyleType="MyCompany.Castle.PerOperationLifestyle.PerOperationLifestyleManager, MyCompany.Castle">
  <parameters>
    <connection>${dataSession.DbConnection}</connection>
  </parameters>
</component>

Однако, когда я запрашиваю у контейнера DataContext, он фактически использует конструктор, требующий строку подключения, несмотря на то, что ${dataSession.DbConnection} является IDbConnection.

Почему это так, и как заставить Виндзор использовать правильный конструктор?

1 Ответ

3 голосов
/ 09 июня 2010

Насколько я знаю, нет способа заставить Виндзор разрешать между разными конструкторами, которые имеют одинаковое количество аргументов с одинаковыми именами, но разными типами.Проблема в том, что все конструкторы DataContext имеют один аргумент с одинаковым именем.

Где я работаю, мы решили эту проблему, получив класс из DataContext, в котором был только один конструктор Виндзорможет удовлетворить, тем самым устраняя проблему.

public class MyCompanyDataContextAdapter : MyCompanyDataContext
{
    public MyCompanyDataContextAdapter(IDbConnection connection)
        : base(connection)
    { }
}
...