Вы позволяете ярусу веб-узлов получать доступ к DAL непосредственно?

В вашей проблеме, когда вы создаете список, включающий все управляемые диски Azure, вы можете отобразить все имя диска из списка следующим образом:

output "disks" {  
  value = "${data.azurerm_managed_disk.disk.*.name}"
}

Давайте рассмотрим пример список нескольких интерфейсов. Когда вы создаете несколько интерфейсов, подобных этому:

resource "azurerm_network_interface" "test" {
  count               = 5
  name                = "acceptanceTestNetworkInterface1"
  location            = "${azurerm_resource_group.test.location}"
  resource_group_name = "${azurerm_resource_group.test.name}"

  ip_configuration {
    name                          = "testconfiguration1"
    subnet_id                     = "${azurerm_subnet.test.id}"
    private_ip_address_allocation = "Dynamic"
  }

  tags {
    environment = "staging"
  }
}

Затем вы можете отобразить все названия интерфейсов, например:

    output "disks" {  
      value = "${azurerm_network_interface.test.*.id}"
    }

Итак, вы должны убедиться, что список является реальным списком. Затем просто выведите результат, как указано выше.

17
задан Marty Pitt 28 April 2009 в 07:36
поделиться

7 ответов

По моему мнению, вы ВСЕГДА должны использовать BLL ( уровень бизнес-логики ) между вашим веб-уровнем и вашим DAL ( доступ к данным Уровень ).

Я ценю, что для некоторых из более «простых» запросов BLL будет близко имитировать DAL (например, «Выбрать все страны», «Выбрать все типы продуктов» и т. Д.), Но, честно говоря, даже в вашем Пример:

(Получить всех клиентов с фамилией «Atwood»)

здесь выражается «бизнес-логика» - желание фильтровать записи данных по фамилии, если ничего больше!

Реализация BLL с самого начала проекта становится невероятно простой вставить либо валидацию, либо дополнительную «логику», когда и когда возникнет необходимость (и если ваш проект является коммерческим приложением, эта потребность почти , безусловно, возникнет в конце концов, если ее не будет в начале проект). Добавление дополнительной логики, такой как:

Извлечение всех клиентов, которые потратили более $ 10000 в этом году

или

Не разрешать клиентам с фамилией «Этвуд» приобретать предметы стоимостью более 1000 долларов

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

Имейте в виду, что с указанными выше типами запросов мы почти наверняка говорим о нескольких сущностях и таблицах базы данных, которые должны будут объединиться вместе со специально определенными отношениями для реализации этой функциональности. Попытка достичь этого путем прямого манипулирования DAL становится грязной, поскольку вы будете иметь дело с несколькими сущностями и классами. BLL здесь значительно упростит ваш код веб-уровня, поскольку BLL будет инкапсулировать эти отношения сущностей за сильно упрощенным интерфейсом.

Это « разделение интересов » становится все более важным, когда и если возникает необходимость изменить пользовательский интерфейс.

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

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

В общем, я не могу думать о какой-либо причине, чтобы НЕ включать слой BLL между моим DAL и моим веб-уровнем.

Проще всего, когда BLL близко «имитирует» DAL, да похоже, что существует дублирование кода и функциональности, хотя, будучи немного более типизированным, это также делает его относительно легким для реализации.

Когда это более сложно (например, когда существенная бизнес-логика существует с самого начала) ), разделение интересов помогает уменьшить количество повторений (принцип DRY ), в то же время значительно упрощая будущее и текущее обслуживание.

Конечно, это предполагает, что вы делаете все это «вручную». ». При желании вы можете значительно упростить слои DAL / BLL / UI, используя ORM , которых много! Я не могу думать ни о какой причине, чтобы НЕ включать слой BLL между моим DAL и моим веб-уровнем.

Самое простое, когда BLL близко «имитирует» DAL, да, похоже, однако дублирование кода и функциональности, хотя и является немного более типичным, это также делает его относительно простым для реализации.

Когда это более сложно (например, когда существенная бизнес-логика существует с самого начала), разделение интересов помогает уменьшить количество повторений (принцип DRY ), в то же время значительно упрощая будущее и текущее обслуживание.

Конечно, это предполагает, что вы делаете все это «вручную». При желании вы можете значительно упростить слои DAL / BLL / UI, используя ORM , которых много! Я не могу думать ни о какой причине, чтобы НЕ включать слой BLL между моим DAL и моим веб-уровнем.

Самое простое, когда BLL близко «имитирует» DAL, да, похоже, однако дублирование кода и функциональности, хотя и является немного более типичным, это также делает его относительно простым для реализации.

Когда это более сложно (например, когда существенная бизнес-логика существует с самого начала), разделение интересов помогает уменьшить количество повторений (принцип DRY ), в то же время значительно упрощая будущее и текущее обслуживание.

Конечно, это предполагает, что вы делаете все это «вручную». При желании вы можете значительно упростить слои DAL / BLL / UI, используя ORM , которых много! (т. е. LINQ-to-SQL / Entities , SubSonic , NHibernate и т. д.)

5
ответ дан 30 November 2019 в 11:13
поделиться

I disagree with most the posts here.

I call my data layer in the web tier. If there is nothing in between the WEB/UI tier there is no point creating a layer "just in case." It's pre optimization. It's a waste. I can't recall a time the business layer "saved me." All it did was created more work, duplication and higher maintenance. I spent years subscribing to the Business Layer --> Data Layer passing entities between the layers. I always felt dirty creating pass through methods that did nothing.

After being introduced to Domain Driven Design by Eric Evans, I do what makes sense. If there is nothing in between the UI and the Data Layer then I call the Data Layer in the UI.

To allow for future changes I wrapper all my Data Layer classes in interfaces. In the UI, I reference the interfaces and I use dependency injection to manage the implementation. After making these changes, it was like a breath of fresh air. If I need to inject something in between the data layer and UI, I create a service.

Another thing I did, was to reduce the number of projects. Before I would have a project for the Data Layer, Business Logic, Business Entities and some type of UI Project -- what a pain.

I have two projects: The core project(entities, business logic and data layer) and UI projects (web, web services, etc...)

For more information I recommend looking at these guys:

34
ответ дан 30 November 2019 в 11:13
поделиться

You need to distinguish BLL objects (what the heck are these anyway? Domain objects anyone?) and Services. Your domain objects should have nothing to do with your data access layer. As far as web tier goes, it can treat your repositories (think IRepository) just like any other service it can freely use.

So the bottom line is: yes, web tier can use DAL directly provided it is property encapsulated and is represented as a standard Service Layer service.

2
ответ дан 30 November 2019 в 11:13
поделиться

Даже если он включен; y одна строка в BLL, вызывающий аналогичный вызов DLL, позволяет абстракции добавлять бизнес-логику на этом уровне, не затрагивая другие уровни. Может показаться, что это не так, как сейчас, но кто бы ни должен был поддержать приложение после того, как вы поблагодарите вас за использование таких шаблонов, когда произойдут изменения.

Что касается именования, у меня есть мой основной объект, скажем NameChange, тогда у меня будет объект BLL, который является человеком, который принимает объект изменения имени, тогда у меня будет объект DAL / Entity, называемый человеком. Объект Business Person находится в пространстве имен BLL, а объект DAL / Entity Person находится в пространстве имен БД (я бы выбрал DAL, если бы изначально его построил).

тогда у меня будет объект DAL / Entity под названием Person. Объект Business Person находится в пространстве имен BLL, а объект DAL / Entity Person находится в пространстве имен БД (я бы выбрал DAL, если бы изначально его построил).

тогда у меня будет объект DAL / Entity под названием Person. Объект Business Person находится в пространстве имен BLL, а объект DAL / Entity Person находится в пространстве имен БД (я бы выбрал DAL, если бы изначально его построил).

1
ответ дан 30 November 2019 в 11:13
поделиться

Мы называем этот уровень классом контроллера [layer], который инкапсулирует DAL из веб-уровня. Уровень контроллера может иметь или не иметь какой-либо бизнес-логики, он помогает отделить DAL от уровня представления и сохранить их независимыми [в некоторой степени].

1
ответ дан 30 November 2019 в 11:13
поделиться

We've tended to use the facade pattern for access, though our project that we use it on is sizable, I think it may prove overkill on a smaller project.

Essentially:

UI -> BusFacade -> BusinessLogic -> DalFacade -> DataAccessLayer

the facade makes for a nice/clean approach from the UI, and forces you to standardise on your naming conventions as that single point of entry has a number of methods.

BusFacade.GetCmsSiteMap()
BusFacade.GetProductGroup()

etc.etc.

0
ответ дан 30 November 2019 в 11:13
поделиться

Хотя это было бы возможно чтобы перейти непосредственно от уровня презентации к DAL, вы пропускаете BLL, который часто требует аутентификации ...

0
ответ дан 30 November 2019 в 11:13
поделиться
Другие вопросы по тегам:

Похожие вопросы: