C # Unity контейнер Ctor для инъекций - PullRequest
2 голосов
/ 12 октября 2011

Скажем, у нас есть:

class A
{
   ILogger myLog;
   A(ILogger log)
   {
      this.myLog = log;
   }
 ...
}

И мы ранее зарегистрировали интерфейс ILogger в контейнере Unity, например

 container.RegisterType<ILogger, SomeLogger>();

А вот класс SomeLogger:

class SomeLogger : ILogger
{
   string myString;
   SomeLogger(string test)
   {
     myString = test;
   }
 ...
}

Теперь, как единство может создать экземпляр SomeLogger для класса A, не передавая строку в ctor SomeLogger?Предположим, что для SomeLogger нет другого ctor.Где можно указать параметры для ctor сопоставленного типа SomeLogger?

Ответы [ 3 ]

2 голосов
/ 12 октября 2011

Вы можете сделать это:

container.RegisterType<ILogger, SomeLogger>(new InjectionConstructor("myStringValue"));
2 голосов
/ 12 октября 2011

Вы можете сделать это в вашей конфигурации:

<?xml version="1.0"?>
<configuration>
    <configSections>
        <section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
    </configSections>
    <unity>
        <containers>
            <container>
                <types>
                    <type type="[Namespace].ILogger, [AssemblyName]" mapTo="[Namespace].SomeLogger, [AssemblyName]">
                        <constructor>
                            <param name="test">
                                <value value="MyDesiredValue" />
                            </param>
                        </constructor>
                    </type>
                </types>
            </container>
        </containers>
  </unity>
</configuration>

Это также декларативно регистрирует ваш тип, поэтому

container.RegisterType<ILogger, SomeLogger>();

звонок больше не нужен.

-Doug

1 голос
/ 12 октября 2011

Вы также можете сделать это в регистрационном коде следующим образом:

UnityContainer.RegisterType<ILogger, SomeLogger>();
UnityContainer.Configure<InjectedMembers>()
              .ConfigureInjectionFor<SomeLogger>(new InjectionConstructor("TestString"));
...