| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Общие вопросы по .NET и C# > Как правильно реализовать архитектуру проекта |
| Автор: Ozligia 18.6.2012, 16:59 | ||||||
| Добрый вечер. UPDATE: Может я не корректно ставлю вопрос. Проще говоря, можно ли реализовать такую схему: 1. Основное приложение задает методы, которые будет использовать 2. Реализация заданных методов находится в библиотеке классов 3. В итоге нужно получить возможность оперативно изменять реализацию методов, при это не затрагивая основное приложение (не выполняя его сборку заново) Попытаюсь понятно объяснить суть проблемы на примере. Допустим есть приложение, которое рисует на экране куб. В этом приложении объявлен интерфейс, допустим такой:
В дальнейшем хочется создать библиотеку классов (также C#), в которой один из классов будет наследовать ITransform и реализовывать метод Transform
Вот только не получается правильно связать проекты в решении (MS Visual Studio 2010). Ведь чтобы в библиотеке был виден интерфейс в главном приложении надо добавить на него ссылку, и чтобы реализуемый в библиотеке метод был виден в главном приложении нужно также добавить на него ссылку, что приведет к циклической ссылке... Этими действиями я пытаюсь добиться того, чтобы главное приложение никак не зависело от реализации метода
То есть, запустили приложение, положили библиотеку, в которой куб разворачивается на 30 градусов - развернули, отрисовали. Положили другую библиотеку, в которой куб, допустим, перекрашивается, нажали "перерисовать", куб перекрасился, отрисовался. Для моей задачи крайне важно такое динамическое изменение без необходимости пересобирать решение целиком. По сути это возможность обновления библиотек, но сигнатура методов должна задаваться основным приложением Подскажите, возможно ли такое реализовать и как? Или, возможно, есть другие более рациональные и правильные подходы? А может я просто пропустил какой-то механизм языка, тогда ткните носом, пожалуйста. |
| Автор: erm0l0v 19.6.2012, 08:51 | ||||
интерфейс должен быть определен в главной библиотеки. Создайте фабричный метод, который будет создавать этот интерфейс. В методе нужно например залесть в определенную папку, найти там dll и подключить её через:
в assembly вы сможете пробежаться по всем типам определенным в сборке и найти наиболее подходящий. В самом простом случае это будет первый найденный тип который реализует ITransform. создать экземпляр найденного типа можно так:
|
| Автор: Ozligia 19.6.2012, 11:39 | ||||
| Спасибо, буду пробовать UPDATE: Так как не сталкивался никогда с фабричными методами то прочитал эту статью: http://andrey.moveax.ru/patterns/oop/creational/factory-method/ Честно говоря, я не понял важности данного паттерна в том виде, в котором он приводился в статье. Вероятно, чтобы это понять нужен более сложный пример, но для себя кое-что из статьи вынес. (Если я правильно понял, то фабричным методом можно называть метод, который создает экземпляр определенного класса в зависимости от входных параметров) В главном приложении делаю так:
И во внешней библиотеке так:
Вроде все должно работать, вот только загвоздка в реализации проверки реализует ли найденный класс указанный интерфейс. В примерах для такой проверки используется оператор "is", но он требует уже созданный объект в качестве своего операнда. Можно ли выполнить такую проверку, зная только тип, к которому принадлежит класс, или придется создавать объект каждого класса в библиотеке, а затем уже выполнять проверку? P.S.: Если подскажете литературу по C# в которой бы широко освещались вопросы использования абстракций, интерфейсов и др., а также общепринятые приемы программирования, то буду рад. |