В конфигурации Unity, как передать connectionString в конструктор? - PullRequest
4 голосов
/ 23 ноября 2010

Я настраиваю конфигурации единиц в файле web.config, и у меня есть тип, который я хочу передать ему строку подключения, которая уже существует в том же файле web.config.

<connectionStrings>
    <add name="DatabaseConnectionString" connectionString="metadata=res://*/Database.csdl|res://*/Database.ssdl|....." providerName="System.Data.EntityClient" />
  </connectionStrings>

и в разделе единства:

<type type="IDatabase" mapTo="Database" >
      <constructor>
          <param name="connectionString" >
             <value value="metadata=res://*/Database.csdl|res://*/Database.ssdl|...."/>
          </param>
      </constructor>
</type>

Но вот так я пишу одну и ту же conectionString дважды в одном и том же файле .config. Есть ли еще лучший способ передать только имя connectionString конструктору базы данных типа, чтобы избежать дублирования в файле web.config?

Ответы [ 2 ]

7 голосов
/ 23 ноября 2010

Вы можете написать свой собственный TypeConverter, как предложено Крисом , отвечая на предыдущий вопрос .

<type type="IDatabase" mapTo="Database" >
      <constructor>
          <param name="connectionString" >
             <value value="DatabaseConnectionString" typeConverter="ConnectionStringTypeConverter"/>
          </param>
      </constructor>
</type>

http://msdn.microsoft.com/en-us/library/ff660914(v=PandP.20).aspx#config_value

EDIT

Этот конвертер должен работать:

public class ConnectionStringTypeConverter : TypeConverter
    {
      public override object ConvertFrom(ITypeDescriptorContext context, System.Globalization.CultureInfo culture, object value)
      {
        return ConfigurationManager.ConnectionStrings[value.ToString()];
      }
    }
0 голосов
/ 23 ноября 2010

Нет ничего встроенного, чтобы сделать это. Вы можете написать расширение схемы, которое будет что-то делать в этом направлении, но в настоящее время это не очень хорошо документированный процесс. Я посмотрю, смогу ли я привести пример позже.

...