Можете ли вы получить доступ к объекту через два слоя сборок? - PullRequest
2 голосов
/ 16 июля 2010

У меня есть открытый класс MainObject, который находится в библиотеке классов (dll), для этого примера мы назовем его BaseLibrary.

У меня есть библиотека классов более высокого уровня, которая ссылается на BaseLibrary для получения доступа кэто участники.Мы назовем эту DeviceLibrary.

У меня будет проект Windows Forms, DeviceControl, в который я добавил ссылку на DeviceLibrary.

Если мне нужно использовать объект MainObject, как мне это сделать?Я знаю, что могу просто добавить вторую ссылку в проекте DeviceControl в BaseLibrary, но мне просто интересно, есть ли другой способ получить к нему доступ через DeviceLibrary?Я не уверен, что законы инкапсуляции здесь диктуют ...

Ответы [ 4 ]

3 голосов
/ 16 июля 2010

У вас есть , чтобы добавить ссылку.Если вы этого не сделаете, то компилятор пожалуется и скажет вам добавить ссылку.Использование рефлексов должно быть очень отдаленным вторым выбором, оно просто замедляет ваш код и все же не устраняет зависимость времени выполнения от DLL.

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

Если вы можете изменить содержимое библиотечных сборок (т. Е. Это ваш код), вы можете:

  1. переместить MainObject в отдельную справочную сборку и иметьлюбая из существующих сборок ссылается на него.Это хорошо работает, если MainObject на самом деле не зависит от другого содержимого BaseLibrary.

  2. Извлеките интерфейс из MainObject и поместите , что , в справочную библиотекучто любая другая сборка может ссылаться.Затем вы пишете код для интерфейса, вам нужна только ссылка на новую справочную библиотеку.

Если вы не можете изменить содержимое библиотечных сборок, вы можете прибегнуть к написаниюобъект-обертка для MainObject со своим собственным интерфейсом и извлечением интерфейса в справочную библиотеку, как в варианте 2.

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

Любой тип, на который вы ссылаетесь в своем коде, должен быть частью сборки с прямой ссылкой.

Хотя обычно это не практично, вы можете использовать MainObject без прямой ссылки на него, используя вместо этого ссылку System.Object и используя Reflection для вызова его членов.В C # 4.0 вы, вероятно, можете просто использовать ключевое слово dynamic:

dynamic x = MethodReturningAMainObject();
x.Foo(); //this will be compiled to use reflection to find "Foo"

Помимо использования динамической или object ссылки, вы можете использовать любой открытый базовый класс или интерфейс, который применяется к MainObject.

0 голосов
/ 16 июля 2010

Отказ от ответственности: это не полностью отвечает на ваш вопрос.

Обычно в дизайне N-уровня «Модели» охватывают все слои. Вот одна диаграмма, на которую я ссылаюсь при проектировании: http://i.msdn.microsoft.com/cc700340.fig01_L(en-us).gif

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

...