Setter injection with Unity 2.0

25 мар. 2011 г. | | |

Пример Setter injection на Unity 2.0 (продолжая тему этого примера)

Имеется интерфей IEmployee и класс Employee, его реализующий:

interface IEmployee
{
int Age { get; set; }
string Name { get; set; }
string Surname { get; set; }
IPosition position { get; set; }
string GetPosition();
}
class Employee : IEmployee
{
#region IPerson Members

public int Age
{ get; set; }

public string Name
{ get; set; }

public string Surname
{ get; set; }

public IPosition position { get; set; }

public String GetPosition()
{
  return position.Position;
}
#endregion
}

А так же есть интерфейс IPosition и набор классов, его реализующих:

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"; } }       
    }
Класс Employee имеет поле property, которое мы и будем инжектить:
>
static void Main(string[] args)
{
IUnityContainer unity = new UnityContainer();
unity.RegisterType<IPosition, JustEmployee>()
.RegisterType<IPosition, Manager>("Manager")
.RegisterType<IPosition, Boss>("Boss")
.RegisterType<IEmployee,Employee>( new InjectionProperty("position", new ResolvedParameter<IPosition>()))
.RegisterType<IEmployee, Employee>("Boss", new InjectionProperty("position", new ResolvedParameter<IPosition>("Boss")))
.RegisterType<IEmployee, Employee>("Manager", new InjectionProperty("position", new ResolvedParameter<IPosition>("Manager")));

List<iemployee> employees = new List<IEmployee>();
var emp = unity.Resolve<IEmployee>();
emp.Name = "John";
emp.Surname = "Malkovich";
emp.Age = 35;
employees.Add(emp);
var manager = unity.Resolve<IEmployee>("Manager");
manager.Age = 44;
manager.Name = "Peter";
manager.Surname = "Branch";
employees.Add(manager);
var boss = unity.Resolve<IEmployee>("Boss");
boss.Name = "Bill";
boss.Surname = "Millioner";
boss.Age = 99;
employees.Add(boss);
foreach(var employee in employees)
{
Console.WriteLine("Person: " + employee.Name + " " + employee.Surname + ", " + employee.Age + ", " + employee.GetPosition());
}
}
Запускаем, смотрим результат:

3 коммент.:

AndrewZvvv комментирует...

Того же эффекта можно достичь, пометив инжектированное свойство атрибутом [Dependency], но это делает не очень удобным создание обертки над Unity, потому что DependencyAttribute - sealed класс, приходится придумывать бубны с декоратором...
И что немножко напрягает еще - необходимость объявления инжектируемых свойств как public... Но тут уж никуда не денешься)
Спасибо за пост, очень интересно!

Unknown комментирует...

А как же инъекции через Constructor injection для private-полей?

AndrewZvvv комментирует...

Так то через конструктор... Делать его безразмерным с двадцатью параметрами тоже не хочется))

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