Какой слой я должен объявить перечисления?

У меня есть проект C# N-Layer, который имеет 5 уровней: 1-инфраструктура, 2-домен, 3-приложение, 4-распределенная служба, 5-презентация.

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

1 - объявить перечисления в домене и пройти через сеть через WCF DataContract.

2 - объявить перечисления в проекте библиотеки классов (например, в общем слое) и построить его как dll и использовать его во всех слоях.

Помоги мне выбрать один.

3 ответа

Решение

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

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

Если приложение и домен будут использовать их, объявите их в домене и передайте значение через сеть.

Я хотел бы поделиться своим мнением по этому поводу:

  • Стратегия 1: доменный слой определяет перечисление AddressType (имея дом, работу...). Сервисный уровень определяет другое перечисление AddressTypeDto со всеми значениями Home, Work...) и они на самом деле отображаются из AddressType ==> AddressTypeDto, На уровне представления, тип AddressTypeDto будет использоваться также.

  • Стратегия 2: создать слой (not really a layer), который содержит общие типы перечислений и использует его в разных слоях от домена / службы / презентации

S1: он сохраняет все уровни Домен / Сервис / Презентация независимыми, но требует больше классов для представления одного и того же.

S2: он поддерживает все уровни Домен / Сервис / Презентация независимыми, но требует их в зависимости от "общих" DLL.

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

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

Лично я работал над решением oniony-DDDish, и наличие дублирующих перечислений и картографов во ВСЕХ слоях чертовски утомительно и никогда не может казаться чистым. Мое решение заключалось в том, чтобы все перечисления находились на уровне домена, а затем, как только данные поступают на внешние уровни (ну, за исключением, конечно, уровня службы приложений), все они становятся int cast. Подумайте: зачем вам еще нужно перечисление? У вас должна быть вся логика на уровне домена, вы не должны делать что-то вроде if (bar.type == types.foo) вне уровня домена, это просто анти-шаблон. Если вам действительно нужно снова значение перечисления на другом уровне, просто объявите повторяющееся перечисление и приведите его обратно... Обычно это может произойти в тестовой сборке.

В многослойных решениях каждый слой должен зависеть только от слоя под ним. Например, если вы работаете с DDD, вы, вероятно,

Уровень представления (должен зависеть от уровня приложения) Уровень приложения (должен зависеть от уровня инфраструктуры) Уровень инфраструктуры (должен зависеть от уровня домена) Уровень домена (не должен зависеть от каких-либо уровней)

Так что в основном Enums обычно являются частью домена, и если вы не хотите отображать, отображать, отображать, то вы должны добавить дополнительные зависимости к уровням презентации и приложения (зависит от домена). Если вы хотите сохранить свою архитектуру в чистом виде, то все, что вы можете сделать, - это карта. Лично мне не нравится отображать перечисления, так как, если нечего отображать, вам придется изобретать новый тип перечисления или создавать исключение. Оба решения не так ясны, как хотелось бы.

Другие вопросы по тегам