Intereting Posts
Можно ли параметризовать имена таблиц и столбцов в запросах SQLite? Как закодировать пользовательские заголовки HTTP в C # Команды AT Отправка / получение SMS Как написать содержимое одного файла в другой файл? Почему невозможно определить общие индексы в .NET? Как я могу поднимать событие каждый час (или конкретный временной интервал каждый час) в .NET? Преобразование даты времени в определенный формат в C # Как удалить выбранный элемент в массиве? WinForm: как эксклюзивно состыковать со стороной экрана Как работает MatchEvaluator в Regex.Replace? Visual Studio 2012 подделки UnitTestIsolation инструментария не удалось инициализировать Передавать параметры конструктору при инициализации ленивого экземпляра Невозможно заставить ScriptManager.RegisterStartupScript в WebControl вложенных в UpdatePanel работать Многоразовые предикатные выражения в запросах LINQ to Entities заполнение datagridview со списком объектов

Как решить круговую ссылку?

Как вы решаете круглые эталонные проблемы, такие как class A, имеет class B как один из его свойств, тогда как class B имеет class A как один из его свойств?

Как сделать архитектора для таких проблем?

Если вы примете пример NHibernate, между объектами будет отношение родитель-потомок.

Как он может обрабатывать эти родительские сценарии для детей?

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

    ДО

    public class Foo { Bar myBar; } public class Bar { Foo myFoo; } 

    График зависимости:

     Foo Bar ^ ^ | | Bar Foo 

    Foo зависит от Bar, но Bar также зависит от Foo. Если они находятся в отдельных assemblyх, у вас возникнут проблемы, особенно если вы выполните чистую перестройку.

    ПОСЛЕ

     public interface IBar { } public class Foo { IBar myBar; } public class Bar : IBar { Foo myFoo; } 

    График зависимости:

     Foo, IBar IBar ^ ^ | | Bar Foo 

    Оба Foo и Bar зависят от IBar. Круговой зависимости нет, и если IBar помещается в собственную сборку, Foo и Bar, находящиеся в отдельных assemblyх, больше не будут проблемой.

    Я бы сказал твоему другу, что ему нужно переосмыслить его дизайн. Циркулярные ссылки, как вы описываете, часто являются кодовым запахом дизайнерской ошибки.

    В отличие от C ++ (например), C # не требует форвардных объявлений для разрешения циклических ссылок. Следовательно:

     public class A { public BB { get;set; } } public class B { public AA { get;set; } } 

    Однако это часто является показателем сомнительных проектных решений.

    В большинстве случаев наилучшим решением является изменение дизайна и исключение циклической зависимости. Например, вы можете выполнить одно из следующих действий:

    1. Переместите общий ссылочный код в проект утилиты в своем решении, а другие проекты ссылаются на проект Utility
    2. Используйте интерфейс, как объяснил «Ed Bayiates» в своем ответе.
    3. Если это небольшое количество простого / общего кода, то перепишите его для одного из classов, поэтому вам не нужно ссылаться на него в циклической зависимости. (мой наименее любимый)

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

    Щелкните правой кнопкой мыши ссылки на проект и выберите «Добавить ссылку …». Затем в появившемся диалоговом окне перейдите на вкладку «Обзор» и кнопку «Обзор». Оттуда вы можете найти DLL и выбрать его. Это в лучшем случае работа и может вызвать проблемы с сборкой, особенно если обе библиотеки DLL обновляются часто и / или имеют множество зависимостей. Я не рекомендую этот метод, но он работает в крайнем случае.

    FiSSH

    интерфейсы – хорошая идея, однако, если вы ищете более быстрое решение, чем переделываете архитектуру стольких вещей, попробуйте создать одну библиотеку classов DLL, в которой хранятся все ваши структуры данных. В вашем основном проекте содержится ваш пользовательский интерфейс, который нуждается в этих данных, а затем любые другие DLL-файлы, которые вы хотите чтобы добавить, можно также получить доступ к этой DLL-структуре данных, чтобы у них была вся информация, которую они должны запускать, но все же может быть раздельной – это называется шаблоном проектирования tri force –