Наилучшая практика для «Кодирования интерфейсов» и бизнес-структур? - PullRequest
0 голосов
/ 23 марта 2011

Следует ли абстрагировать бизнес-объекты с помощью интерфейсов и / или базовых классов, чтобы при их передаче использовались только интерфейсы / базовые классы?(это то, что мы делаем).

Или не следует абстрагировать сущности с помощью интерфейсов, и вы должны использовать наследование только при необходимости?

Причина, по которой я задаю этот вопрос, заключается в том, что у меня естьвсегда абстрагировал все части кода моего приложения, используя интерфейсы, насколько это возможно.Это упростило мне выполнение модульных тестов с использованием mock и т. Д. Кроме того, используя интерфейсы, я мог убедиться, что только фабричные классы действительно ссылаются на проекты, содержащие реализацию, а все остальные (например, Business Logic Layer) только ссылаютсяпроект, содержащий все интерфейсы.

Выше все работало хорошо до сих пор.Но теперь нам нужно раскрыть некоторые из наших бизнес-методов через WCF.Бизнес-методы, используемые для возврата интерфейсов, но теперь, когда я пытаюсь повторно использовать один и тот же метод и выставить его через WCF, WCF не нравится тот факт, что я использую и возвращаю интерфейсы как часть аргументов метода службы.

Теперь я мог попытаться исправить проблему, используя KnownTypes и ServiceKnownTypes, но у меня возникло мнение, что если бы я не использовал интерфейсы для бизнес-объектов, являющихся частью моего приложения, я бы не столкнулся с этой проблемой.

Поэтому мне было интересно, есть ли лучшая практика, когда речь заходит о новом проекте: должны ли у вас быть интерфейсы для всех ваших бизнес-структур или нет?

1 Ответ

1 голос
/ 23 марта 2011

На самом деле вы можете сказать WCF использовать ваш интерфейс по проводам, так что это не проблема.

Это настройка в диалоге добавления справочника услуг.

Вам нужна опция «Повторное использование типов в ссылочных сборках».

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

http://msdn.microsoft.com/en-us/library/bb514724.aspx

Чтобы обойти базовый класс и узнать о подклассах, вы можете сделать что-то вроде этого:

[KnownType("GetKnownTypes")]
public abstract class Shape
{
    static Type[] GetKnownTypes()
    {
        //do some reflection here to look up all classes that extend Shape
        //and are serializable
        return results;
    }
}

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

...