Почему я должен ссылаться на эту сборку, даже если она не используется - PullRequest
6 голосов
/ 08 июля 2010

У меня есть такая архитектура:

Данные (библиотека классов, которая обрабатывает наши вещи Entity Framework)
Компоненты (библиотека классов среднего уровня, которая ссылается на библиотеку данных)
WebOffice (веб-приложение, которое ссылается на библиотеку компонентов, но НЕ на библиотеку данных)

Теперь у меня есть следующий фрагмент кода (он находится внутри нашего Components.Payment.cs; а tblPayment содержится в нашей библиотеке данных.):

    public static Payment Retrieve(int id)
    {
        var t = repository.Retrieve(id);
        //the above line returns a tblPayment object
        if (t != null)
            return new Payment(t);
        return null;
    }


    public static Payment Retrieve(tblPayment tblPayment)
    {
        return new Payment(tblPayment);
    }

После того, как я добавил это; проект WebOffice выдает следующую ошибку:
errorCS0012: тип «Data.Model.tblPayment» определен в сборке, на которую нет ссылок. Необходимо добавить ссылку на сборку «Данные, версия = 3.5.0.0, культура = нейтральная, PublicKeyToken = 749b8697f3214861».

Теперь, для меня это не совсем имеет смысла, потому что проект WebOffice вообще не вызывает метод Retrieve (tblPayment tblPayment). (Используется только внутри библиотеки компонентов)

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

Ответы [ 3 ]

6 голосов
/ 08 июля 2010

Общее правило здесь заключается в том, что ссылка на содержащую сборку любого типа в открытом интерфейсе другой сборки должна быть добавлена ​​в проект. В противном случае компилятор не знает, как разрешить этот тип.

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

2 голосов
/ 08 июля 2010

Компилятору необходимо знать, что такое tblPayment, чтобы выполнить разрешение перегрузки для метода Resolve.

1 голос
/ 08 июля 2010

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

...