Конфигурируем Unity 2.0 через xml-файл

11 апр. 2011 г. | | |

Цель данной заметки - рассмотреть простой случай конфигурации Unity через xml-файл. 
Формат конфигурации Unity и более подробная информация касательно каждой секции тут http://msdn.microsoft.com/en-us/library/ff650027.aspx#config_format

И так, если вы не хотите прописывать все зависимости в коде, как это делается, например, тут (http://sly-and-fluffy.blogspot.com/2011/03/setter-injection-with-unity-20.html), то велкам. Сначала рассмотрим простейший случай. У нас есть интерфейс и три класса, его реализующих:

public interface IPosition
    {
        string Position { get; }       
    }

    public class JustEmployee : IPosition
    {
        public string Position { get { return "Just employee"; } }        
    }

    public class Manager : IPosition
    {
        public string Position { get { return "Manager"; } }       
    }

    public class Boss : IPosition
    {
        public string Position { get { return "Boss"; } }       
    }

Теперь конфигурируем Unity таким образом:

var map = new ExeConfigurationFileMap { ExeConfigFilename = "Unity.config" };
var config = ConfigurationManager.OpenMappedExeConfiguration(map, ConfigurationUserLevel.None);
var section = (UnityConfigurationSection)config.GetSection("unity");
var container = new UnityContainer();
section.Containers.Default.Configure(container);

И код, использующий IPosition:

List<IPosition> positions = new List<IPosition>();
positions.Add( container.Resolve<IPosition>() );
positions.Add(container.Resolve<IPosition>("Manager"));
positions.Add(container.Resolve<IPosition>("Boss"));
foreach (var position in positions)
{
Console.WriteLine("Position: " + position.Position);
}

И результат:
Что же такого волшебного находится в файле Unity.config? Вот полный текст:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<configSections>
<section name="unity" type="Microsoft.Practices.Unity.Configuration.UnityConfigurationSection, Microsoft.Practices.Unity.Configuration" />
</configSections>
<unity xmlns="http://schemas.microsoft.com/practices/2010/unity">
<namespace name="UnityTest" />
<assembly name="UnityTest1" />
<alias alias="IPosition" type="UnityTest.IPosition" />
<alias alias="JustEmployee" type="UnityTest.JustEmployee" />
<alias alias ="Manager" type ="UnityTest.Manager"/>
<alias alias ="Boss" type ="UnityTest.Boss"/>
<container>
<register type="IPosition" mapTo="JustEmployee" />
<register name ="Manager" type ="IPosition" mapTo ="Manager" />
<register name ="Boss" type ="IPosition" mapTo ="Boss" />
</container>
</unity>
</configuration>

А теперь обо всём по порядку.
В теге "section" указывается название тега, в котором находится весь конфиг. В данном случае это "unity". В теге "unity" мы указываем namespace, assembly и aliasы для типов данных. Вроде очевидные вещи, но обратите внимание, что в namespace указываем пространство имён (UnityTest), а в assembly (UnityTest1) - имя сборки. Если не указывать два этих тега, то в alias для в атрибуте type обязательно нужно указывать имя сборки:

<alias alias="IPosition" type="UnityTest.IPosition, UnityTest1" />

Алиасы нужны для удобства, указывать их тоже не обязательно; если их не указывать, то нужно указывать полное имя типа в тегах "register", которые соответствуют методу Register<TypeTType1, TType2>().
Вот и все для начала. В следующем посте рассмотрим конфигурирование через xml injections.

0 коммент.:

Отправить комментарий