Struttura di applicazione:
Livello aziendale
public interface IOrderDataService
{
void Save(Order order);
}
public interface IOrderLineDataService
{
void Save(OrderLine orderLine);
}
public class OrderManager
{
private IOrderDataService _OrderDataService;
private IOrderLineDataService _OrderLineDataService;
public void Create(Order order, List<OrderLine> lines)
{
_OrderDAtaService.Save(order);
foreach(var line In lines)
{
line.Id = order.Id;
// some other business logic
_OrderLineDataService(line);
}
}
}
Il livello dati implementa gli intereface "DataService" dal livello aziendale
public class SqlOrderDataService : IOrderDataService
{
void Save(Order order) {};
}
public class SqlOrderLineDataService : IOrderLineDataService
{
void Save(OrderLine orderLine) {};
}
Ora desidero che la creazione dell'ordine utilizzi SqlTransaction
per la creazione di righe ordine e ordine. Ma ..
Se avvolgo un metodo OrderManaget.Create
con SqlTransactionScope
- funzionerà, ma il livello aziendale dipenderà dal database sql.
Se creo un metodo wrapper che crei sia Order
che OrderLine
s. E usa la transazione lì - funzionerà
public interface IOrderManagerDataService
{
void Save(OrderLine orderLine, OrderLine lines);
}
Ma in questo caso la logica di business sarà nell'implementazione Sql del livello dati. Che violano una separazione di preoccupazioni e voglio tenerlo sul livello aziendale.
Hai qualche consiglio per questo problema?