Отличаются ли ссылочные зависимости C # от VB? - PullRequest
5 голосов
/ 23 октября 2011

Предположим, у нас есть 3-уровневое приложение, и у нас есть три проекта с именами P1, P2, P3.

Зависимость: P1 (данные) << P2 (бизнес-логика) << P3 (презентация)</em>

P2 получил базовый класс X , который был унаследован в другом классе Y в P2.Итак, мы добавляем ссылку P1 к P2.Однако P3 использует P2. Y и не использует P1. X напрямую.

Чтобы сделать это, мы должны добавить ссылку P2 к P3.Но есть разница между VB и C # .

В VB , мы добавляем ссылку P2 только к P3.P2 использует P1, но это не имеет значения для P3.Нам не нужно добавлять ссылку P1 к P3 .Этого достаточно!

Но в C # мы должны добавить ref P1 и P2 к P3 , даже если P3 не использует P1.X.Если вы не добавите ссылку A к C, вы получите ошибку ниже:

Тип 'P1.X' определен в сборке, на которую нет ссылок.Необходимо добавить ссылку на сборку «P1, Версия = 1.0.0.0, Культура = Нейтральная, PublicKeyToken = null».

Почему мы должны добавить два проекта в C #?

Иливместо этого мы можем заблокировать это поведение?

1 Ответ

1 голос
/ 23 октября 2011

Возможная причина в том, что P2 публично выставляет членов, типы которых определены в P1.В этом случае на P1 также следует ссылаться в P3, даже если вы не используете его явно в P3.

Пример:

// Assembly P1
public class C1
{
    ...
}

// Assembly P2
public class C2
{
    public string Foo { get; set; }
    public C1 Bar { get; set; }
}

// Assembly P3
void Main()
{
    C2 c = ...
    Console.WriteLine(c.Foo);
}

В приведенном выше коде P3 использует C2 (определенов P2), а C2 предоставляет член типа C1 (определенный в P1), поэтому P3 должен ссылаться на P1 (даже если он не использует C2.Bar) .


РЕДАКТИРОВАТЬ: на самом деле я был неправ: вы должны ссылаться на P1, только если вы делаете ссылку C2.Bar ... Поведение точно такое же, как в VB, как в C #, я только что попробовал (если вы не добавите ссылку на P1, выполучите эту ошибку ).Если у вас ранее не было этого ограничения в проектах VB, это только потому, что P3 не использовал ничего, что зависело от P1.

...