2016-12-05 4 views
0

у меня есть C# WebAPI приложение, которое имеет следующую структуру enter image description hereVisual Studio C# решения многих проектов (зависимости)

Решение имеет много проектов, ядро ​​проекта, который является фактическим проектом WebAPI и более одного отдельных проектов которые используются для связи с внешними системами. Мой проект использует зависимость Инъекция: В базовом проекте, возможно, в его веб-конфигурации определена внешняя система. Когда различные зависимости регистрируются существует код, как этот

string ExternalSystem = ConfigurationManager.AppSettings["ExternalService"]; 
switch(ExternalSystem) 
      { 
       case "ExtA": 
        this.RegisterType<ExtA.ExternalService>().As<IExternalService>().InstancePerRequest(); 
        break; 
       case "ExtB": 
        this.RegisterType<ExtB.ExternalService>().As<IExternalService>().InstancePerRequest(); 
        break; 
       default: 
        this.RegisterType<ExternalService>().As<IExternalService>().InstancePerRequest(); 
        break; 
      } 

Определение IExternalService находится в проекте ядра и каждый из Extrnal систем имеет собственную реализацию этого интерфейса. Таким образом, решение о том, какая из реализаций будет использоваться, определяется в файле веб-конфигурации в основном проекте. У этой реализации есть одна проблема. Когда я создаю свой релиз библиотеки DLL, я должен включать в себя все DLLS внешней системы (даже если они не используются), в противном случае строк кода, как этот

this.RegisterType<ExtA.ExternalService>().As<IExternalService>().InstancePerRequest(); 

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

+0

Этот вопрос не ясен. Вы говорите об установщиках? – Liam

+0

Нет, это приложение для веб-приложений. Установщиков нет. Проблема в том, что мне нужно загрузить мое приложение на многие серверы для разных клиентов. Клиент A использует внешнюю систему A, клиент B использует внешнюю систему B и так далее. Используя текущую архитектуру, я должен загрузить все DLL из всех внешних систем всем клиентам ... –

+0

и почему это проблема? Поместите все dll на все серверы и управляйте конфигурацией. Я не вижу проблемы с тем, что у вас уже есть? – Liam

ответ

2

Возможно использование условных заявлений может работать. Вместо этого:

using Lib_ExtA; 
using Lib_ExtB; 
using Lib_General; 

... используйте:

#if UseExtA 
using ExternalService = ExtA.ExternalService; 
#endif 
#if UseExtB 
using ExternalService = ExtB.ExternalService; 
#endif 
#if UseGeneral 
using ExternalService = General.ExternalService; 
#endif 

... а затем просто:

this.RegisterType<ExternalService>().As<IExternalService>().InstancePerRequest(); 

Вы можете совместить это с switch подходом, давая дополнительная проверка, если вы сделали все правильно, но это в основном означает, что вы делаете это дважды.

Ссылки:

#if (C#)
https://msdn.microsoft.com/en-us/library/4y6tbswk.aspx

/определения (параметры компилятора C#)
https://msdn.microsoft.com/en-us/library/0feaad6z.aspx

+0

Это кажется крутым. Я попробую это –

+0

Я просто понимаю, что Project References может все еще сделать это трудно или даже невозможно для достижения вашей цели. Возможно, развертывание только того, что нужно, будет работать, но вам придется попытаться это выяснить. –

+0

Это все равно потребует включения всех dll (что, по моему мнению, является тем, что получает OP). BTW pre-compiler оптимизирует использование операторов, поэтому неиспользуемые ссылки удаляются во время компиляции. – Liam

Смежные вопросы