Пример Setter injection на Unity 2.0 (продолжая тему этого примера)
Имеется интерфей IEmployee и класс Employee, его реализующий:
А так же есть интерфейс IPosition и набор классов, его реализующих:
Класс Employee имеет поле property, которое мы и будем инжектить:Запускаем, смотрим результат:
Имеется интерфей 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"; } }
}
>
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 коммент.:
Того же эффекта можно достичь, пометив инжектированное свойство атрибутом [Dependency], но это делает не очень удобным создание обертки над Unity, потому что DependencyAttribute - sealed класс, приходится придумывать бубны с декоратором...
И что немножко напрягает еще - необходимость объявления инжектируемых свойств как public... Но тут уж никуда не денешься)
Спасибо за пост, очень интересно!
А как же инъекции через Constructor injection для private-полей?
Так то через конструктор... Делать его безразмерным с двадцатью параметрами тоже не хочется))
Отправить комментарий