Une façon vous pouvez résoudre une dépendance circulaire est d'avoir une couche entre vos deux ensembles:
Au lieu de ce scénario;
Assemblée Modèle:
public class Customer{
//...
}
Assemblée des données:
public class CustomerDAO{
public Customer LoadCustomer(int id){
return new Customer(id,...);
}
}
où l'ensemble de modèle fait référence à l'ensemble des données et des données ne peut pas atteindre de nouveau dans le modèle pour instancier un client.
Vous pouvez avoir à la place;
Assemblée Modèle:
public class CustomerModel:Customer{}
public class ModelFactoryImp:ModelFactory{
public Customer CreateCustomer(int id,//...customer params){
return new CustomerModel(...);
}
}
ModelInterfaces Assemblée:
public abstract class Customer{//...}
public abstract ModelFactory{
Customer CreateCustomer(int id,//...customer params);
}
données Assemblée:
public class CustomerDAO{
private ModelFactory _modelFactory;
public CustomerDAO(ModelFactory modelFactory){
_modelFactory = modelFactory;
}
public Customer LoadCustomer(int id)
{
// Data Access Code
return _modelFactory.CreateCustomer(id,//...cutomer params);
}
}
Lorsque les deux modèles et ensembles de données dépendent de la couche de ModelInterfaces et vous passez le client Data Access Object une implémentation de la classe ModelFactory afin que je t peut créer des clients.
Ceci est un bon moyen si vous êtes confronté à la tâche difficile de résoudre la dépendance circulaire, mais une bonne conception ne devrait pas éliminer une telle dépendance en premier lieu. –
Toutes les conceptions sont des compromis, et dans tout système complexe, vous trouverez des zones où vous avez besoin d'une communication bidirectionnelle entre les composants. La programmation fonctionnelle offre un certain nombre d'outils, tels que les rappels, les continuations et les fermetures. Une autre solution polyvalente et commune pour le problème est les gestionnaires d'événements; la couche inférieure fournit le gestionnaire d'événements et déclenche des événements, tandis que la couche supérieure enregistre un gestionnaire d'événements pour recevoir des notifications. (Regardez INotifyPropertyChanged dans .NET pour un excellent exemple.) L'injection de dépendance offre une autre approche pour résoudre les problèmes de dépendance. –