Реализация API со сменной серверной реализацией в .NET (F #) - PullRequest
3 голосов
/ 11 февраля 2010

Я пытаюсь понять, как реализовать заменяемые компоненты или интерфейс поставщика услуг в мире .NET. Я подозреваю, что просто не знаю подходящей терминологии для поиска.

В частности, я играю с классом Matrix, который имеет разные бэкэнды. В самом простом случае матрица предоставляет двухпараметрические методы get и set и конструктор. Реализация не важна для конечного пользователя. Например, в зависимости от размера матриц, матрица может поддерживаться массивом в памяти, файлом или распределенным хранилищем значений ключей. Я хотел бы скрыть реализацию бэкэнда и позволить третьим сторонам предоставлять новые реализации бэкенда.

Идеальный API, вызванный из IronPython, скажем, может быть что-то вроде

a = matrix(data = 0, rows = 1000, cols = 10, backend = 'file://test.txt')
a[100, 2] = 1
print a[100, 2]

Что я должен читать, чтобы понять схему для этого типа проблемы?

Я играю в F # и IronPython, но не верю, что этот вопрос специфичен для какого-либо конкретного языка .Net.

Ответы [ 3 ]

6 голосов
/ 11 февраля 2010

Да, вы можете создать интерфейс IMatrix и конкретный класс, который его реализует, например:

type IMatrix =
    abstract Item : (int * int) -> single with get, set

type ConcreteMatrix (data:single[,])=
    interface IMatrix with
        member t.Item with get((x,y)) = data.[x,y]
                      and set((x,y)) value = do data.[x,y] <- value

let printCoordinate (x, y) (matrix : #IMatrix) =
    printf "%A" matrix.[x, y]
3 голосов
/ 11 февраля 2010

Другие ответы @Stringer и @Khalid хороши.

Я бы подвел итог, сказав

  • интерфейсы - это механизм для создания единого API, который поддерживается несколькими реализациями, и
  • фабрики может быть полезным шаблоном для построения экземпляров различных реализаций - хотя, возможно, просто конструкторы в различных классах (новый ArrayMatrix, новый FileMatrix) или перегрузки (CreateMatrix (...), CreateMatrix (..., имя файла строки)) или просто логика, основанная на данных (MakeMatrix (..., конец строки), где backend - это имя файла, за исключением этого "массива" или null возможно означает что-то еще) достаточно
3 голосов
/ 11 февраля 2010

Вы хотите создать интерфейс, который представляет контракт, который является матрицей. Вы, вероятно, в конечном итоге назовете это что-то вроде IMatrix. Затем создайте несколько реализаций этого интерфейса: MemoryMatrix, FileMatrix, DistributedKeyValueMatrix. Когда вы передаете конкретную реализацию в своем коде, просто обращайтесь к интерфейсу вместо конкретного типа.

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

Возможно, вы захотите использовать одну из двух вещей для разрешения ваших конкретных типов: Создайте класс MatrixFactory, который может создавать все реализации, которые вы производите. Используйте контейнер Inversion of Control, чтобы определить нужный тип бетона.

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