Условное пространство имен в приложении Winform - PullRequest
1 голос
/ 03 июня 2011

Я хочу узнать лучший способ определения пространств имен в моих проектах.У нас есть 2 разных проекта winform, и есть определенные кодовые файлы и формы, которые мы используем в обоих проектах.Итак, структура проектов 1 и 2 ниже:

//Project Pro1
//-------------------------------------
//Class C1 starts
#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
    Method M1
    {
        call to C2.M2
    }

}

//Class C2 starts
namespace pro1
{
Class C2
    Method M2

}

//Project Pro2
//----------------


#if pro1
using pro1
#endif
#if pro2
using pro2
#endif
namespace common_fun
{
Class C1
    Method M1
    {
        call to C2.M2
    }

}

namespace pro2
{
Class C2
    Method M2

}

Итак, здесь класс C1 (в пространстве имен common_fun) является общим файлом, используемым в обоих проектах.Но в этом нам нужно вызвать метод M2 класса C2, а для вызова этого метода нам нужно написать условные операторы сверху.то есть

#if pro1
using pro1
#elseif pro2
using pro2
#endif

Итак, мой вопрос, есть ли лучший способ включить пространства имен для общих файлов?так как в будущем может быть 3-4 проекта, которые будут использовать те же классы / формы.

Спасибо.

Ответы [ 2 ]

1 голос
/ 03 июня 2011

есть определенные файлы кода и формы, которые мы используем в обоих проектах.

Если я вас правильно понял, вы ссылаетесь на эти файлы кода в обоих проектах, а не помещаете их в отдельныйсборка.Если бы вы попытались поместить свои «общие классы» в такую ​​библиотеку (как это рекомендуется при написании кода для повторного использования), вы бы заметили, что компилятор / компоновщик не позволил бы вам сделать это: вместо этого он бырассказал вам о том, что у вас действительно есть: циклическая зависимость между C1 и всеми вариантами C2.Этого следует избегать при создании кода, которым вы хотите поделиться между различными проектами, потому что он делает код трудным для тестирования и сложным для обслуживания (вы уже заметили это, поскольку проблема пространства имен является одной из тех типичных проблем, которые могут возникнуть в такихситуация).

Решение sacklpicka (с использованием интерфейса) является одним из способов решения этой проблемы, делая C1 готовым для размещения в собственной библиотеке.Другой способ - просто передать M2 в качестве делегата в конструктор C1 или дать C1 событие, которое запускается при каждом вызове M1, поэтому пользователи C1 могут зарегистрировать свои методы M2 в качестве обработчика события..

1 голос
/ 03 июня 2011

Я бы сделал общий интерфейс, содержащий ваш метод M2:

 interface ICommonFun
 {
      void M2();
 }

Затем передайте реализацию этого интерфейса вашему классу C1:

 class C1
 {
      ICommonFun Instance;

      public void M1()
      { 
         Instance.M2();
      }

      public C1(ICommonFun fun)
      {
          Instance = fun;
      }
  }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...