2015-10-21 4 views
0

Мне нужно создать код, где мне нужно использовать несколько ссылок на веб-службу. Все ссылки на службы являются, по сути, конечными точками для одной и той же службы, но для разных источников данных. Таким образом, все эти ссылки содержат одни и те же функции.Ссылаясь на dll динамически

Возможно ли построить решение, которое динамически проверяет ссылки и выполняет одну и ту же функцию для всех из них. Фактически что-то вроде:

for serviceRef in serviceRefs: 
    serviceRef.doSomething(); 

Я знаю, что это надуманный, любая помощь будет оценена.

Редактировать (для наглядности): Эти ссылки являются ссылками SOAP API, поэтому определения методов также загружаются из Интернета. Но поскольку все ссылки относятся к одной и той же службе (только для разных учетных записей), методы во всех них одинаковы.

+0

Можете ли вы назвать сервисного клиента по-разному, а не поместить на него абстрактный заводский шаблон? Я думаю, что он предоставит вам возможность вызвать любое требуемое обслуживание, основанное на требовании. –

+0

Конструктор ссылок службы имеет перегрузку, чтобы вручную обеспечить привязку. Таким образом, вы можете использовать разные конечные точки. – Silvermind

+0

@Silvermind Я понимаю, что мне нужно вручную предоставить привязку, и я назову иначе (скажем, serviceRef1, serviceRef2 и т. Д.). Что я хочу знать, так это то, что я могу перебрать все из них? –

ответ

-1

Попробуйте загрузить сборку с использованием отражения.

public List<IServiceInterface> CreateShippingInstance(string assemblyInfo) 
{ 
    Type[] assemblyType = Type.GetTypeArray(assemblyInfo); 
    if (assemblyType != null) 
    { 
     List<IServiceInterface> serviceClientList = new List<IServiceInterface>(); 
     Type[] argTypes = new Type[] { }; 

     foreach(var item in argTypes) 
     { 
      ConstructorInfo cInfo = assemblyType.GetConstructor(argTypes); 

      IServiceInterface serviceClient = (IServiceInterface)cInfo.Invoke(null); 

      if(serviceClient!=null) 
      serviceClientList.Add(serviceClient); 
     } 

     return serviceClientList; 
    } 
    return null;  
} 

Теперь ваш основной код будет таким.

List<IServiceInterface> serviceClientList = CreateShippingInstance("Namespace, classname");//class full name with namespace, you can google for details 

foreach(var item in serviceClientList) 
{ 
    item.DoOperation(); 
} 

Для безопасного кода вы можете использовать отдельный проект для ссылок на службы.

Надеюсь, это поможет!

+0

Я думал об этом, хотя без настройки интерфейса проблема в том, что мне придется вручную добавить любой новый случай. Я хотел бы более динамичный итератор, если это возможно. –

+0

@ShubhamPandey ok может быть, вы можете использовать отражение для этого. Попробуйте код в моем отредактированном сообщении. Просто убедитесь, что вы получаете конечные точки из web.config, а не по коду. –

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