Как вставить аргумент конструктора из конфигурационного файла с Unity - PullRequest
10 голосов
/ 18 ноября 2011

Представьте, что у нас есть класс

public class MyClass
{
    private string _val;
    public MyClass(string val) 
    {
         _val = val;
    }
}

и app.config (или web.config)

<appSettings>
    <add key="value" value="some value" />
</appSettings>

Есть ли способ зарегистрировать тип MyClass в контейнере Unity и указать Unity наввести значение для параметра конструктора val из файла конфигурации?

Ответы [ 3 ]

9 голосов
/ 22 ноября 2011

это очень просто.

C # Код:

var container = new UnityContainer();
container.LoadConfiguration();
MyClass mc = container.Resolve<MyClass>();

Файл конфигурации:

<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">    
 <container>
  <register type="[namespace].MyClass, [assembly-name]" 
    mapTo="[namespace].MyClass, [assembly-name]">
    <constructor>
      <param name="val" value="Ethan Woo"/>
    </constructor>
  </register>
</container>

5 голосов
/ 18 мая 2015

Довольно старый пост, но я подумал, что следующая информация может быть полезна в случае, если это не значение для нативного типа, а комплексный тип данных:

<configuration>

  <configsections>
    <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration">
    </section>
  </configsections>

  <unity xmlns="http://schemas.microsoft.com/practices/2010/unity">

    <alias alias="IRepository" type="UnityTest.IRepository, UnityTest">
      <alias alias="Repository" type="UnityTest.Repository, UnityTest">

        <container>
          <register mapto="Repository" type="IRepository">

            <register name="MyClass" type="UnityTest.MyClass, UnityTest">
              <constructor>
                <param name="repository" type="IRepository">
                <dependency name="IRepository">

                </dependency>
              </constructor>
            </register>

          </register>
        </container>

      </alias>
    </alias>
  </unity>

</configuration>

Немного более подробно описано здесь: http://postlabs.blogspot.com/2015/05/injecting-non-native-data-type-via.html

5 голосов
/ 27 октября 2014

Если вы используете XML-конфигурацию, вы можете сделать это, определив расширение, которое обрабатывает AppSettings в качестве параметров Unity, см. http://www.neovolve.com/2010/04/23/appsetting-parameter-injection-in-unity-2/.

В качестве альтернативы, если вы выполняете настройку C #, вы можете использовать конструктор инъекций следующим образом...

var container = new UnityContainer();
container.RegisterType<MyClass>(
    new InjectionConstructor(
       InjectionParameter<string>(ConfigurationManager.AppSettings["value"])));

Причина использования значения AppSettings вместо строки непосредственно в XML-конфигурации заключается в том, что он централизует все значения параметров в AppSettings и упрощает миграцию между средами.

...