Я бы создал методы расширения для каждого вызываемого AddRelationship, передав другой объект в качестве параметра.
Переданный объект добавит отношение, а затем вызовет метод AddRelationship другого:
static void AddRelationship(this ConfigManager configMgr, ErrorManager errMgr)
{
this.ErrorManager = errMgr;
if (this != errMgr.ConfigManager)
errMgr.AddRelationship(this);
}
static void AddRelationship(this ErrorManager errMgr, ConfigManager configMgr)
{
this.ConfigManager = configMgr;
if (this != configManager.errMgr)
configMgr.AddRelationship(this);
}
Это означает, что вы можете добавить связь, используя любой объект.
ConfigManager cfg = new ConfigManager();
ErrorManager err = new ErrorManager();
//Assign using either:
err.AddRelationship(cfg);
//Or
cfg.AddRelationship(err);
Вы также должны создать расширения RemoveRelationship.
static void RemoveRelationship(this ConfigManager configMgr, ErrorManager errMgr)
{
if (this.errorManager == errMgr)
{
this.errorManager = null;
if (errManager.configManager == this)
errMgr.RemoveRelationship(this);
}
}
static void RemoveRelationship(this ErrorManager errMgr, ConfigManager cfgMgr)
{
if (this.ConfigManager == cfgMgr)
{
this.configManager = null;
if (cfgMgr.errorManager == this)
cfgMgr.RemoveRelationship(this);
}
}
Я не знаю, что циклические ссылки являются особенно хорошей практикой кодирования, но это должно решить вопрос в том виде, в котором он был задан.