У меня есть вопрос о том, как правильно подойти к разделению службы веб-API от бизнес-логики, особенно при использовании стека служб. Код, который я пытаюсь улучшить, похож на следующий:
public class TenantService : Service
{
public object Post(TenantRequest req)
{
//create an instance of the struct to hold the data
TenantObject tenant = new tenant{ //set properties from the resquest};
TenantRecord.InsertRecord(tenant)
// create a response after this //
}
}
то в моей бизнес-логике у меня есть что-то похожее на следующее:
public class TenantRecord
{
public static void InsertRecord(TenantObject tenant)
{
//Instantiate a new Tenant POCO
Tenant newRecord = new Tenant
{
Id = 1, Name = tenant.Name, CreatedDate = DateTime.Now, ...//And so on
};
db.Insert(newRecord);
}
}
Это приводит к массивной головной боли, связанной с постоянным повторным написанием того же кода, что и основной код, но постоянное создание структур для передачи информации назад и вперед вызывает тонну отображения данных. Кроме того, в некоторых случаях один запрос должен обрабатывать множество различных типов информации.
Должна ли бизнес-логика ссылаться на API и передавать сам запрос, или этот метод является наиболее подходящим? Любая помощь будет оценена.
ServiceStack предоставляет методы расширения AutoMapping, которые упрощают сопоставление объектов DTO с вашей моделью, поэтому вам не нужно вручную настраивать отношения.
Таким образом, ваш метод Insert
просто становится:
public class TenantService : Service
{
public object Post(TenantRequest req)
{
var tenant = new Tenant { CreatedDate = DateTime.Now }.PopulateWith(req);
Db.Save(tenant);
return new { Id = tenant.Id };
}
}
Я бы сохранил бизнес-логику в методах действий, если у вас нет конкретной потребности в этой дополнительной абстракции, такой как повторное использование. Кроме того, ваш статический метод InsertRecord
потребует разрешения экземпляра db
. Добавление ненужного осложнения.