Внедрение через конструктор

157
25 февраля 2019, 22:50

Изучаю внедрение зависимостей, появился вопрос. Может ли быть такое что два класса зависят друг от друга как в примере ниже. (Внедрение через конструктор)

Можно так делать?

public class AService {
  private BService _bService;
  public A(BService bService) {
    _bService = bService;
  }
  public void DoA1() {
    //зависимость не используется
  }
  public void DoA2() {
    //зависимость используется, нужны методы DoB1 b DoB2
    if(condition) _bService.DoB1() else _bService.DoB2();
  }
}
public class BService {
  private AService _aService;
  public BService(AService aService) {
    _aService = aService;
  }
  public void DoB1() {
    //зависимость не используется
  }
  public void DoB2() {
    //для метода B нужен только результат метода DoA1()
    _aService.DoA1();
  }
}
Answer 1

На яве можно сделать так, на шарпе аналогично, используя функциональные интерфейсы:

class AService{
    public AService(){}
    public void DoA1() {
        System.out.println("aserv");
        //зависимость не используется
    }
}
class BService{
    public BService() {
    }
    public void DoB1() {
        System.out.println("bser");
        //зависимость не используется
    }
}
@FunctionalInterface
interface IService {
    void doClass();
}
class ServiceImpl {
    public static void doClass(IService iService) {
        iService.doClass();
    }
}
public class Main{
    public static void main(String[] args) {
        BService bService = new BService();
        ServiceImpl.doClass(bService::DoB1);//()->{//здесь ваша логика}
    }
}

Если с условиями:

BService bService = new BService();
AService aService = new AService();
ServiceImpl.doClass(()->{
  if(false){
    bService.DoB1();
  }else {
    aService.DoA1();
  }
});
READ ALSO
Для чего нужен делегат Action

Для чего нужен делегат Action

Что есть делегат Action и когда нужно его использовать?

153
Подключение dll в скриптах MindDecider

Подключение dll в скриптах MindDecider

Как в MindDecider в скрипте подключить свою библиотеку dll?

146
Как правильно составить LINQ запрос

Как правильно составить LINQ запрос

Есть квадратный массив, например такой :

147