Размещение пользовательских библиотек за интерфейсом C # - PullRequest
0 голосов
/ 11 марта 2012

Я пытаюсь применить хорошую архитектуру в своем приложении для компьютерного зрения. Поскольку я использую библиотеку .net (EMGU.CV), которая обертывает собственные подпрограммы OpenCV, мне нужно использовать интерфейсы C # для абстрагирования классов EMGU, чтобы иметь возможность заменить их в будущем.

Конкретный пример:

В EMGU у меня есть класс детектора переднего плана, который выставляет класс Image<T,T>. Этот вызов является чисто EMGU-ориентированным.

Я работаю над IBackgroundDetector для моего приложения, которое предположительно будет поддерживать различные фоновые детекторы, включая EMGU.

Так что для метода в моем интерфейсе

interface IBackgroundDetector
{
   SomeGeneralImageType GetCurrentBackgroundFrame(SomeGeneralImage CameraFrame);
}

Как мне создать класс SomeGeneralImageType, чтобы получить хорошую архитектуру?

1 Ответ

0 голосов
/ 11 марта 2012

Идея состоит в том, чтобы создать интерфейс с именем ISomeGeneralImageType.
Объявите набор методов, которые вам понадобятся для изображения (посмотрите на C # Image в качестве примера длячто вам, вероятно, понадобится)

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

Способ, которым вы могли бы сделать это, - использовать инкапсуляцию, чтобы скрытьвсе сложные вещи, которые вы обычно делаете.

Например (я действительно не знаю реального интерфейса вашего объекта, это просто чтобы показать идею):

interface ISomeGeneralImageType
{
   void SetHeight(int height);
   Byte[] GetBitBuffer();
}

class ImageEMGU : ISomeGeneralImageType
{
    private Image<T,T> innerImage;

    public override Byte[] GetBitBuffer()
    { 
       innerImage.GetMeSomeBits()
    }

    public override  SetHeight(int height)
    {
       innerImage.EMGUHight(height);
    }
}

ТогдаВы можете использовать свой фоновый детектор на любом изображении, которое реализует ваш интерфейс:

interface IBackgroundDetector
{
   SomeGeneralImageType GetCurrentBackgroundFrame(ISomeGeneralImage CameraFrame);
}
...