Comment gérer les dépendances circulaires avec RequireJS/AMD?

Dans mon système, j'ai un certain nombre de "classes" chargé dans le navigateur de chaque un des fichiers séparés au cours du développement, et concaténées pour la production. Comme ils sont chargés, ils initialiser une propriété sur un objet global, ici G, comme dans cet exemple:

var G = {};

G.Employee = function(name) {
    this.name = name;
    this.company = new G.Company(name + "'s own company");
};

G.Company = function(name) {
    this.name = name;
    this.employees = [];
};
G.Company.prototype.addEmployee = function(name) {
    var employee = new G.Employee(name);
    this.employees.push(employee);
    employee.company = this;
};

var john = new G.Employee("John");
var bigCorp = new G.Company("Big Corp");
bigCorp.addEmployee("Mary");

Au lieu d'utiliser mon propre objet global, j'envisage de faire de chaque classe à ses propres AMD module, basé sur James Burke suggestion:

define("Employee", ["Company"], function(Company) {
    return function (name) {
        this.name = name;
        this.company = new Company(name + "'s own company");
    };
});
define("Company", ["Employee"], function(Employee) {
    function Company(name) {
        this.name = name;
        this.employees = [];
    };
    Company.prototype.addEmployee = function(name) {
        var employee = new Employee(name);
        this.employees.push(employee);
        employee.company = this;
    };
    return Company;
});
define("main", ["Employee", "Company"], function (Employee, Company) {
    var john = new Employee("John");
    var bigCorp = new Company("Big Corp");
    bigCorp.addEmployee("Mary");
});

Le problème est qu'avant, il n'y avait pas de déclarer dépendance entre l'Employé et de l'Entreprise: vous pouvez mettre de la déclaration, dans l'ordre que vous voulais, mais maintenant, à l'aide de RequireJS, ce qui introduit une dépendance, qui est ici (intentionnellement) circulaire, de sorte que le code ci-dessus échoue. Bien sûr, dans addEmployee(), l'ajout d'une première ligne de var Employee = require("Employee"); serait le faire fonctionner, mais je ne vois que cette solution comme inférieurs à pas à l'aide de RequireJS/AMD car il exige de moi, le développeur, d'être conscient de cette nouvelle circulaire de la dépendance et de faire quelque chose à ce sujet.

Est-il une meilleure façon de résoudre ce problème avec RequireJS/AMD, ou suis-je à l'aide de RequireJS/AMD pour quelque chose, il n'a pas été conçu pour?

InformationsquelleAutor avernet | 2011-02-02