Невозможно выполнить инъекцию свойства с помощью Autofac
Я новичок в автофаке. Я пытаюсь сделать инъекцию свойства, используя этот контейнер IoC. Ниже мой код. Я получаю ошибку:
В экземпляре объекта не задана ссылка на объект
На этой линии:return _salary.employeeSalary
; в GetSalary(int employeeId)
метод. В классе Программы я даже пытался, build.RegisterType<Employee>().WithProperty("_salary", new Salary{ employeeId = 5, employeeSalary = 500 });
public interface IEmployee
{
double GetSalary(int employeeId);
}
public interface ISalary
{
int employeeId { get; set; }
double employeeSalary { get; set; }
}
public class Salary : ISalary
{
public int employeeId {get; set;}
public double employeeSalary { get; set; }
}
public class Employee: IEmployee
{
public ISalary _salary;
public double GetSalary(int employeeId)
{
if (employeeId == 5)
{
return _salary.employeeSalary;
}
else
{
return 0;
}
}
}
public class Program
{
static void Main(string[] args)
{
var build = new ContainerBuilder();
build.RegisterType<Salary>().As<ISalary>();
build.RegisterType<Salary>().As<ISalary>().PropertiesAutowired();
var container = build.Build();
Employee employee = container.Resolve<Employee>();
Console.WriteLine(employee.GetSalary(5));
Console.ReadLine();
}
}
3 ответа
Опция 1:
Чтобы получить Property Injection
для работы со свойствами обратите внимание, что _salary
это поле, и что вам нужно, чтобы настроить его как свойство.
Кроме того, ответ@ehasanul-hoque, вы можете изменить _salary
поле должно быть приватным и добавить публичное свойство, как (см. этот ответ для более подробной информации):
private ISalary _salary;
public ISalary Salary
{
get
{
return this._salary;
}
set
{
_salary = this.value;
}
}
Вариант 2:
Если вы по-прежнему не хотите преобразовывать его в свойство, вы можете использовать Method Injection
, добавив SetSalary
метод как:
public class Employee: IEmployee
{
private ISalary _salary;
public void SetSalary(ISalary salary)
{
this._salary = salary;
}
}
И застройщик может выглядеть так:
var builder = new ContainerBuilder();
builder.RegisterType<Salary>().As<ISalary>();
builder.RegisterType<Employee>()
.OnActivated(IActivatedEventArgs<Employee> e) =>
{
var salary = e.Context.Resolve<ISalary>();
e.Instance.SetSalary(salary);
});
var container = build.Build();
Employee employee = container.Resolve<Employee>();
Вы должны определить свою собственность как ниже
public ISalary _salary { get; set; }
Тогда приведенный ниже код будет работать для вас
var build = new ContainerBuilder();
// build.RegisterType<Salary>().As<ISalary>();
build.RegisterType<Salary>().As<ISalary>();
build.RegisterType<Employee>().As<IEmployee>().PropertiesAutowired();
var container = build.Build();
IEmployee employee = container.Resolve<IEmployee>();
Console.WriteLine(employee.GetSalary(5));
Console.ReadLine();
Создать конструктор в Employee
public Employee(ISalary salary)
{
_salary = salary;
}
Зарегистрируйте сотрудника, как это
build.RegisterType<Employee>().As<IEmployee>()
.WithParameter(new TypedParameter(typeof(ISalary), "salary"));
Решите это так
var employee = container.Resolve<IEmployee>(new NamedParameter("salary",
new Salary { employeeId = 5, employeeSalary = 500 }));