2010-06-20 2 views
1

Мое приложение имеет как минимум 2 проекта, организацию и контактное управление. Раньше я ссылался на ContactManagement, потому что мне нужно работать с классом, находящимся в OrganizationManagement. Теперь мне нужно сделать обратное, но я получаю следующую ошибку: «Не могу ссылаться на OrganManagement ..., чтобы избежать круговой ссылки.«ASP.NET MVC: как избежать круговой ссылки между двумя проектами

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

Чтобы решить эту проблему, я скопировал класс в папку, расположенную в другом проекте, и попытался это

var contact = (Contact)TempData["contact"]; 

Теперь, я получаю эту ошибку: Не удается преобразовать неявно ContactManagement.Contact в OrganizationManagement.Contact ... явное преобразование существует ...

Спасибо за помощь

ответ

2

Возможно, вам необходимо реорганизовать все общие классы, связанные с доменом, на свой собственный новый проект, на который затем можно будет ссылаться другие проекты.

С другой стороны, я мог бы предложить очень плохое обходное решение для ошибки, с которой вы сталкиваетесь, путем определения явного преобразования между структурно идентичными классами, которые отличаются только именем. Но, пожалуйста, не делайте этого. Поместите все материалы домена (например, связанные с entitiy классы, такие как Contact, Person, Organization, Customer и т. Д.) В свой собственный проект и ссылайтесь на это из проектов, требующих классов.

+0

Ну, я как раз собирался написать метод, который делает явное преобразование. Почему я не должен делать явное преобразование, а скорее передавать общие классы в новый проект ??? Есть ли какое-либо техническое или конструктивное обоснование? – Richard77

+0

Это скорее дизайнерское решение, которое вы должны принять. То, что вы сделали на самом деле, было дублирование кода, не так ли? И это приводит к его собственным особым проблемам. Представьте, что произошло, если вы изменили один из классов домена, например. добавьте новый атрибут. Есть ли особая причина, почему вы сомневаетесь в реорганизации классов домена в свою собственную (классную библиотеку - ну, это предназначено именно для того, что я мог бы достичь) проекта? – Andreas

+0

Я не стесняюсь делать то, что вы предлагаете. (на самом деле мне нравится ваш ответ, особенно вышеупомянутый комментарий). Я просто хотел получить больше информации. Согласны ли вы с тем, что лучше начать всю историю? – Richard77

3

Это может быть не так плохо, как вы думаете - это проект всегда может ссылаться на свои собственные классы, не требуя явной ссылки.

Однако, когда возникает такая структурная проблема, обычно говорят, что есть недостаток в общем дизайне.

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

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

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

+0

Похоже, что круговая референция - огромная проблема. Все, что я хотел, это просто переводить время от времени, когда это необходимо. Теперь мне придется пройти через мой код. – Richard77

1

Скомпилируйте оба проекта и скопируйте сборки в папку «libs». Не ссылайтесь на проекты, кроме скомпилированных сборок.

Это работает для меня. У меня есть 1 проект Shop с Backend ShopBackend. Затем у меня есть проект MarketPlace с backend MarketPlaceBackend. Оба основных проекта не так много общего. Markeplace - очень маленькое приложение.

В ShopBackend есть заказ класса, который обращается к ShopDatabase. В MarketPlace я использую Assembly ShopBackend для получения списка заказов.

С другой стороны, в магазине мне нужен список участников MarketPlace. Вот почему я называю сборку MarketPlace.

Да, этот дизайн иногда болит: трудно изменить версии, если подпись методов изменилась. Но в моем случае приложения действительно раздельны, и у них есть отдельные базы данных.

Что я хочу сказать: круговая ссылка может легко быть проблемой дизайна, но это не обязательно. Представьте, что оба приложения поступали от разных компаний. Я считаю, что было бы хорошо, если Microsoft.dll использует некоторые методы с google.dll, а google.dll использует методы microsoft.dll.

Смежные вопросы