Невозможно выполнить инъекцию свойства с помощью Autofac - PullRequest
0 голосов
/ 21 января 2019

Я новичок в autofac. Я пытаюсь сделать инъекцию свойства, используя этот контейнер IoC. Ниже мой код. Я получаю ошибку:

Ссылка на объект не установлена ​​для экземпляра объекта

В этой строке:. return _salary.employeeSalary; в методе GetSalary(int employeeId). В классе Program я даже попробовал, 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 ]

0 голосов
/ 21 января 2019

Создать конструктор в 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 }));
0 голосов
/ 23 января 2019

Вариант 1:

Чтобы заставить Property Injection работать со свойствами, обратите внимание, что _salary - это поле , и что вам нужно настроить его как Свойство .

Кроме того, @ ehasanul-hoque answer , вы можете изменить поле _salary, чтобы оно было приватным, и добавить публичное свойство, например (см. Этот answer для получения более подробной информации):

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>();
0 голосов
/ 21 января 2019

Вы должны определить свою собственность как ниже

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();
...