Как минимум, вы должны отделить ваши классы от интерфейсов. Таким образом, ваш предполагаемый контракт между двумя классами будет явно зафиксирован через интерфейсы.
interface IA {
// Methods for use in class B...
}
class A : IA {
private readonly IB b;
}
interface IB {
// Methods for use in class A...
}
class B : IB {
private readonly IA a;
}
Кроме этого, это во многом зависит от характера взаимодействия, которое вы планируете.