Основываясь на приведенном ниже объяснении и примере, каковы руководящие принципы и рекомендации по использованию типов, объектов и свойств между различными уровнями распределенного приложения? Также обратите внимание, что я использую более одного слова для обозначения архитектурной концепции. Я не хочу говорить об SOA или DDD, поскольку моя реализация религиозно не следует какому-либо стилю.
Слои и использование объектов Пользовательский интерфейс (модели / ресурсы) -> Веб-сервис (ответ на запрос) -> бизнес-уровень (сущности домена / бизнес-объекты).
Объяснение объектов и их связь со слоем
UI (использует модели / ресурсы)
Веб-сервис (ответ может содержать 1 или несколько моделей / ресурсов и любые другие необходимые свойства)
Бизнес-уровень (возвращает ответ "не такой же, как веб-ответ", содержащий 1 или несколько бизнес-объектов / доменов POCO, они будут сопоставлены с веб-ресурсом и ответом)
Должен ли мой бизнес-уровень использовать бизнес-объекты или я могу использовать свойства, как в примере ниже.
Мой «веб-уровень» в стиле RPC с шаблоном запроса и ответа передаст свойства запроса на уровень моего приложения (бизнес-уровень). Мой бизнес-уровень вернет объект ответа (тип принадлежит бизнес-уровню), который содержит несколько сущностей / бизнес-объектов домена POCO, он будет снова сопоставлен с ресурсами и ответом.
Мой веб-API / сервисный уровень
public Resources.InboundReceivingResponse Post(Resources.InboundReceivingRequest request)
{
Resources.InboundReceivingResponse response = new Resources.InboundReceivingResponse();
Granite.DomainModel.Services.ServiceResponse serviceResponse = null;
try
{
_service = new DomainModel.Services.ReceivingService();
//calling business layer with request properties and returning response (business objects)
serviceResponse = _service.Receive(request.DocumentNumber, request.Barcode, request.TrackingEntityBarcode, request.LocationBarcode,
request.MasterItemCode, request.ItemAliasCode, request.UOM, request.PackSize, request.Qty, request.UserID,
request.PalletBarcode, request.Batch, request.SerialNumber, request.ExpiryDate, request.NumberOfLabels,
request.NumberOfEntities, request.Comment, request.Reference);
//Domain object to resource
response.Document = new Resources.DocumentResponse();
response.Document.DocumentHeader = serviceResponse.Document.MapToResource(); //Domain object to resource
response.Document.DocumentLines = serviceResponse.Document.Detail.MapToResource(); //Domain object to resource
return response;
}
catch (Exception ex)
{
Logger.LogException(ex, () => request, () => response, () => serviceResponse);
throw new ApplicationException(ex.Message, ex);
}
}
Мой метод бизнес-уровня
public Services.ServiceResponse Receive(string documentNumber, string Barcode, string TrackingEntityBarcode,
string LocationBarcode, string MasterItemCode, string ItemAliasCode, string UOM, decimal PackSize,
decimal Qty, long UserID, string PalletBarcode, string Batch, string SerialNumber, DateTime? ExpiryDate,
int NumberOfLabels, long NumberOfEntities, string Comment, string Reference)
{
Services.ServiceResponse response = new ServiceResponse();
//...logic
response.Document = this.GetDocument(documentNumber); //this will map back to resource
response.TrackingEntities = trackingEntities;//this will map back to resource
return response;
}