Аспекты заменяют репозиториями?

Я начал экспериментировать с Кенгуру Spring просто недавно. Это делает очень хорошее задание, помогающее одной сборке модель предметной области с интегрированной персистентностью скорее быстро. Поскольку это добавляет функциональность персистентности в аспектах, я запустил, думают о следующем вопросе:

Кенгуру добавляет, средства поиска (загрузите экземпляр класса от базы данных, которая соответствует переменным критериям) в аспекте к фактическому классу/объекту. В DDD это - по моему скромному мнению, ответственность репозиториев. Репозитории являются явными классами, которые обнаруживаются в дизайне. Конечно, как аспект функциональность репозитория скрыта в объекте и в значительной степени невидима.

Таким образом, вот вопрос: действительно ли аспектом является реальная замена для явного класса репозитория? Там какие-либо оборотные стороны являются Кенгуру подходом AOP?

5
задан spa 13 February 2010 в 23:28
поделиться

3 ответа

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

Я также счел эту статью очень полезной.

Ниже приведен сценарий powershell для создания пула приложений, веб-сайта и сертификата SelfSsl:


function CreateAppPool ([string]$name, [string]$user, [string]$password)
{
    # check if pool exists and delete it - for testing purposes
    $tempPool  = gwmi -namespace "root\MicrosoftIISv2" -class "IISApplicationPoolSetting" -filter "Name like '%$name%'"
    if (!($tempPool -eq $NULL)) {$tempPool.delete()}

    # create Application Pool
    $appPoolSettings = [wmiclass] "root\MicrosoftIISv2:IISApplicationPoolSetting"
    $newPool = $appPoolSettings.CreateInstance()

    $newPool.Name = "W3SVC/AppPools/" + $name
    $newPool.WAMUsername = $user
    $newPool.WAMUserPass = $password

    $newPool.PeriodicRestartTime = 1740
    $newPool.IdleTimeout = 20
    $newPool.MaxProcesses = 1
    $newPool.AppPoolIdentityType = 3

    $newPool.Put()
}

function CreateWebSite ([string]$name, [string]$ipAddress, [string]$localPath, [string] $appPoolName, [string] $applicationName)
{
    # check if web site exists and delete it - for testing purposes
    $tempWebsite  = gwmi -namespace "root\MicrosoftIISv2" -class "IISWebServerSetting" -filter "ServerComment like '%$name%'"
    if (!($tempWebsite -eq $NULL)) {$tempWebsite.delete()}

    # Switch the Website to .NET 2.0
    C:\windows\Microsoft.NET\Framework\v2.0.50727\aspnet_regiis.exe -sn W3SVC/

    $iisWebService  = gwmi -namespace "root\MicrosoftIISv2" -class "IIsWebService"

    $bindingClass = [wmiclass]'root\MicrosoftIISv2:ServerBinding'
    $bindings = $bindingClass.CreateInstance()
    $bindings.IP = $ipAddress
    $bindings.Port = "80"
    $bindings.Hostname = ""

    $iisWebService.CreateNewSite($name, $bindings, $localPath)

    # Assign App Pool
    $webServerSettings  = gwmi -namespace "root\MicrosoftIISv2" -class "IISWebServerSetting" -filter "ServerComment like '%$name%'"
    $webServerSettings.AppPoolId = $appPoolName
    $webServerSettings.put()

    # Add wildcard map
    $wildcardMap = "*, c:\somewildcardfile.dll, 0, All"
    $iis = [ADSI]"IIS://localhost/W3SVC"
    $webServer = $iis.psbase.children | where { $_.keyType -eq "IIsWebServer" -AND $_.ServerComment -eq $name }
    $webVirtualDir = $webServer.children | where { $_.keyType -eq "IIsWebVirtualDir" }
    $webVirtualDir.ScriptMaps.Add($wildcardMap)

    # Set Application name
    $webVirtualDir.AppFriendlyName = $applicationName

    # Save changes
    $webVirtualDir.CommitChanges()

    # Start the newly create web site
    if (!($webServer -eq $NULL)) {$webServer.start()}
}

function AddSslCertificate ([string] $websiteName, [string] $certificateCommonName)
{
    # This method requires for you to have selfssl on your machine
    $selfSslPath = "\program files\iis resources\selfssl"

    $certificateCommonName = "/N:cn=" + $certificateCommonName

    $certificateValidityDays = "/V:3650"
    $websitePort = "/P:443"
    $addToTrusted = "/T"
    $quietMode = "/Q"


    $webServerSetting = gwmi -namespace "root\MicrosoftIISv2" -class "IISWebServerSetting" -filter "ServerComment like '$websiteName'"
    $websiteId ="/S:" + $webServerSetting.name.substring($webServerSetting.name.lastindexof('/')+1)

    cd -path $selfSslPath
    .\selfssl.exe $addToTrusted $certificateCommonName $certificateValidityDays $websitePort $websiteId $quietMode
}

$myNewWebsiteName = "TestWebsite"
$myNewWebsiteIp = "192.168.0.1"
$myNewWebsiteLocalPath = "c:\inetpub\wwwroot\"+$myNewWebsiteName
$appPoolName = $myNewWebsiteName + "AppPool"
$myNewWebsiteApplicationName = "/"
$myNewWebsiteCertificateCommonName = "mynewwebsite.dev"

CreateAppPool $appPoolName "Administrator" "password"
CreateWebSite $myNewWebsiteName $myNewWebsiteIp $myNewWebsiteLocalPath $appPoolName $myNewWebsiteApplicationName
AddSslCertificate $myNewWebsiteName $myNewWebsiteCertificateCommonName
-121--4268386-

Вы можете использовать это свойство CLLocationManager:

@property(readonly, NS_NONATOMIC_IPHONEONLY) CLLocation *location;

Значение этого свойства равно nil , если данные о местоположении никогда не были получены, в противном случае это место где core Поэтому, если вы всегда хотите начать с нуля, просто проверьте, является ли это свойство nil или not. если это nil , то вы в порядке; в противном случае необходимо остановить диспетчер местоположения и запустить его снова: это приведет к обновлению, в результате которого кэшированное значение будет перезаписано только что запущенным новым.

-121--4594654-

Добавление поисковиков в классы доменов кажется более естественным с точки зрения пользователя, но смешивает слои. Грайлс использует тот же подход, добавляя статический искатель * () save (),... методы.

Помимо эстетики, она может иметь практические недостатки, когда не используется в настройке веб- приложения: Классы домена теперь привязаны к базе данных. Если вы передаете эти объекты клиентам с расширенными возможностями через RMI или, если вы хотите, чтобы клиент не использовал методы find *, клиент не может и часто не может использовать методы find *, так как на клиенте отсутствует подключение к сеансу или базе данных.

Я обычно предпочитаю, чтобы классы доменов ссылались на интерфейсы уровня обслуживания для предотвращения анемической модели домена ( http://martinfowler.com/bliki/AnemicDomainModel.html ). Это имеет свой собственный набор недостатков, но, по меньшей мере, обеспечивает четкую границу. На клиенте конкретная реализация за сервисным интерфейсом может затем просто прокси все вызовы метода на сервер (или просто использовать synamic proxy с пружинным удалением или sth подобное).

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

2
ответ дан 15 December 2019 в 01:00
поделиться

Это зависит от того, насколько сложен уровень сохраняемости ваших приложений и насколько вы контролируете его. Если ваше приложение достаточно простое для реализации через JPA , тогда все это можно будет обрабатывать через аспекты Roo. Однако, если вы сопоставляете устаревшие таблицы или вам нужны расширенные возможности БД, вы можете оказаться в ситуации, когда Spring-JDBC является единственным выходом, и в этих случаях модель репозитория / дао все еще может быть полезной.

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

1
ответ дан 15 December 2019 в 01:00
поделиться

Я считаю, что добавление методов репозитория к объектам домена - плохой дизайн. Правильным местом были бы статические методы в доменном классе. Но объекты домена и управление ими - это две разные вещи, которые следует разделять. Я бы предпочел доменные объекты и репозитории.

Думаю, мотивацией было добиться чего-то вроде Rails / Grails с Java.

1
ответ дан 15 December 2019 в 01:00
поделиться
Другие вопросы по тегам:

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