C #, доступ к классам из ссылочного проекта - PullRequest
2 голосов
/ 08 мая 2009

В C # я разрабатываю несколько служб Windows, которые имеют некоторые стандартные функции, поэтому я поместил все эти общие функции в отдельный проект утилит, на который ссылаются.

У меня есть ситуация, когда мне нужно создать экземпляры бизнес-классов, которые находятся в моем проекте службы Windows, из служебного проекта с использованием Activator.CreateInstance.

Мой служебный проект знает о пространстве имен и имени класса для вызова Type.GetType, но тип всегда равен нулю, и когда я думаю об этом, он не сможет получить тип из проекта, на который ссылается или может это?

Короче говоря:

Проект A ссылается на служебный проект.
Служебный проект хочет создать класс из проекта А. Он знает о пространстве имен и имени класса.

Есть ли шаблон проектирования или подход, которому я должен следовать для достижения этой функциональности? Или это выглядит как нет, нет, и я должен рефакторинг?

Спасибо за внимание

Ответы [ 4 ]

4 голосов
/ 08 мая 2009

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

  • Использование интерфейсов для разделения A и B. (предпочтительное решение)
  • Переместите деталь, необходимую для A и B, в C и укажите только C из A и B.
1 голос
/ 08 мая 2009

Вы можете посмотреть в контейнеры для ввода зависимостей / ioc.

Например, создайте интерфейс в служебной библиотеке и реализуйте его в определенном классе в службе Windows. Затем передайте экземпляр в служебный класс. Таким образом, служебная библиотека ничего не знает о службе Windows.

1 голос
/ 08 мая 2009

Вам нужно указать полное имя сборки (включая версию и т. Д., Если оно строго именовано), если вы хотите, чтобы Type.GetType нашел тип, который отсутствует ни в mscorlib, ни в вызывающей сборке.

Например:

// Prints nothing
Console.WriteLine(Type.GetType("System.Linq.Enumerable"));
// Prints the type name (i.e. it finds it)
Console.WriteLine(Type.GetType("System.Linq.Enumerable, System.Core, "
     + "Version=3.5.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089"));

В качестве альтернативы, вы можете сделать это универсальным методом в проекте утилиты и заставить вызывающую сторону указать тип в качестве аргумента типа?

0 голосов
/ 08 мая 2009

Звучит как круговая ссылка! Вам может понадобиться рефакторинг!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...