У меня есть интерфейс ITradingApi
следующим образом:
public interface ITradingApi
{
IOrder CreateOrder(...);
IEnumerable<Symbol> GetAllSymbols();
// ...
}
Это должно быть фасадом для различных API-интерфейсов поставщиков торгового программного обеспечения. Моя модель просмотра имеет зависимость от этого торгового API в своем конструкторе:
public class MainViewModel
{
public MainViewModel(ITradingApi tradingApi) { /* ... */ }
// ...
}
Я использую Ninject в качестве контейнера IoC, поэтому я создам экземпляр моей модели представления следующим образом:
var vm = kernel.Get<MainViewModel>();
Теперь моя проблема:
Для реализации ITradingApi
могут потребоваться дополнительные параметры для работы.
Пример:
- API-интерфейс одного поставщика использует TCP/IP внутренне, поэтому мне нужно имя хоста и порт.
- Другой поставщик использует COM-объект. Здесь мне не нужна информация.
- Третьему поставщику требуется имя пользователя и пароль учетной записи.
В духе недопущения неполных объектов я добавил их в качестве параметров к конструкторам конкретных реализаций.
Теперь я не уверен, как это будет работать. Очевидно, что эти дополнительные параметры не относятся к интерфейсу, поскольку они специфичны для каждой реализации.
С другой стороны, эти дополнительные параметры должны вводиться конечным пользователем, а затем передаваться в реализацию ITradingApi
, что означает, что пользователь ITradingApi
нуждается в глубоких знаниях о конкретной реализации.
Как решить эту дилемму?
UPDATE:
Один из подходов может заключаться в создании ITradingApiProvider
, который предоставляет список требуемых параметров. View мог автоматически создать форму ввода для этих параметров, которая привязана к параметрам в ITradingApiProvider
. Теперь, когда экземпляр ITradingApi
запрашивается у поставщика, он может использовать эти параметры для создания экземпляра конкретной реализации. Очевидно, что реализация ITradingApiProvider
и ITradingApi
тесно связана, но я думаю, что это не проблема, если каждая реализация ITradingApi
поставляется с соответствующей реализацией ITradingApiProvider
.