Модераторы: Partizan, gambit
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Как правильно реализовать архитектуру проекта, Интерфейс и класс во внешней библиотеке 
V
    Опции темы
Ozligia
  Дата 18.6.2012, 16:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Добрый вечер.

UPDATE:
Может я не корректно ставлю вопрос.
Проще говоря, можно ли реализовать такую схему:
1. Основное приложение задает методы, которые будет использовать
2. Реализация заданных методов находится в библиотеке классов
3. В итоге нужно получить возможность оперативно изменять реализацию методов, при это не затрагивая основное приложение (не выполняя его сборку заново)


Попытаюсь понятно объяснить суть проблемы на примере.

Допустим есть приложение, которое рисует на экране куб.
В этом приложении объявлен интерфейс, допустим такой:
Код

public interface ITransform{
Cube Transform(Cube cube);
}

В дальнейшем хочется создать библиотеку классов (также C#), в которой один из классов будет наследовать ITransform и реализовывать метод Transform
Код

class CubeTransform : ITransform
{
   public Cube Transform(Cube cube)
   {
      //Повернуть куб на 30 градусов
      return cube;
   }
}


Вот только не получается правильно связать проекты в решении (MS Visual Studio 2010). Ведь чтобы в библиотеке был виден интерфейс в главном приложении надо добавить на него ссылку, и чтобы реализуемый в библиотеке метод был виден в главном приложении нужно также добавить на него ссылку, что приведет к циклической ссылке...

Этими действиями я пытаюсь добиться того, чтобы главное приложение никак не зависело от реализации метода 
Код

Cube Transform(Cube cube){return cube;}

То есть, запустили приложение, положили библиотеку, в которой куб разворачивается на 30 градусов - развернули, отрисовали. Положили другую библиотеку, в которой куб, допустим, перекрашивается, нажали "перерисовать", куб перекрасился, отрисовался. Для моей задачи крайне важно такое динамическое изменение без необходимости пересобирать решение целиком. По сути это возможность обновления библиотек, но сигнатура методов должна задаваться основным приложением

Подскажите, возможно ли такое реализовать и как? Или, возможно, есть другие более рациональные и правильные подходы? А может я просто пропустил какой-то механизм языка, тогда ткните носом, пожалуйста.

Это сообщение отредактировал(а) Ozligia - 18.6.2012, 22:46
PM MAIL   Вверх
erm0l0v
Дата 19.6.2012, 08:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 157
Регистрация: 11.1.2011

Репутация: 1
Всего: 1



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

var assembly = Assembly.LoadFile("MyDLL.dll");


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

создать экземпляр найденного типа можно так:
Код

Activator.CreateInstance(type);

PM MAIL   Вверх
Ozligia
Дата 19.6.2012, 11:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 24
Регистрация: 15.10.2009

Репутация: нет
Всего: нет



Спасибо, буду пробовать

UPDATE:
Так как не сталкивался никогда с фабричными методами то прочитал эту статью:
http://andrey.moveax.ru/patterns/oop/creat...factory-method/

Честно говоря, я не понял важности данного паттерна в том виде, в котором он приводился в статье. Вероятно, чтобы это понять нужен более сложный пример, но для себя кое-что из статьи вынес. (Если я правильно понял, то фабричным методом можно называть метод, который создает экземпляр определенного класса в зависимости от входных параметров)

В главном приложении делаю так:
Код

interface ITransform
   {
      void Transform(Cube cube);
   }
public class main
{
   ITransform transformObj
   ITransform FabricMethod()
   {
      //Загрузка внешней библиотеки и поиск
      return new foundClass();
   }
   void TransformCube()
   {
      this.transformObj.Transform(new Cube());
   }
}

И во внешней библиотеке так:
Код

class SampleClass : ITransform
{
   public void Transform(Cube cube)
   {
      //Разворачиваем куб
   }
}


   Вроде все должно работать, вот только загвоздка в реализации проверки реализует ли найденный класс указанный интерфейс. В примерах для такой проверки используется оператор "is", но он требует уже созданный объект в качестве своего операнда. Можно ли выполнить такую проверку, зная только тип, к которому принадлежит класс, или придется создавать объект каждого класса в библиотеке, а затем уже выполнять проверку?

P.S.: Если подскажете литературу по C# в которой бы широко освещались вопросы использования абстракций, интерфейсов и др., а также общепринятые приемы программирования, то буду рад.

Это сообщение отредактировал(а) Ozligia - 19.6.2012, 16:16
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Прежде чем создать тему, посмотрите сюда:
mr.DUDA
THandle

Используйте теги [code=csharp][/code] для подсветки кода. Используйтe чекбокс "транслит" если у Вас нет русских шрифтов.
Что делать если Вам помогли, но отблагодарить помощника плюсом в репутацию Вы не можете(не хватает сообщений)? Пишите сюда, или отправляйте репорт. Поставим :)
Так же не забывайте отмечать свой вопрос решенным, если он таковым является :)


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, mr.DUDA, THandle.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Общие вопросы по .NET и C# | Следующая тема »


 




[ Время генерации скрипта: 0.0694 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.