HiveBrain v1.2.0
Get Started
← Back to all entries
patterncsharpMinor

Which pattern to choose for passing alerts from service method back to user?

Submitted by: @import:stackexchange-codereview··
0
Viewed 0 times
methodchoosepassinguserbackserviceforwhichfrompattern

Problem

Considering the code sample below, which approach of service method design would be considered best-practice and why? The one used in SaveOrder1 or the one in SaveOrder2?

UPDATE: To be clear, I'm not talking about web service here, but application-type-agnostic service class from my business logic layer. I marked parts of code to focus on for this discussion, but included whole example for people to be able to actually try it.

UPDATE 2: As everyone is obsessed with exceptions, I just want to clarify that Alerts are not only errors. I need to return multiple messages of different importance/type from business logic in my service method, and handling exceptions is not what solves that problem.

```
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.Linq;

namespace Patterns
{
class Program
{
static void Main(string[] args)
{
SaveOrder1();
SaveOrder2();
}

static void SaveOrder1()
{
var order = new Order();
var service = new MyService();

//////////////////////////////////////////////////
// Usage of service method marked as OPTION 1
//////////////////////////////////////////////////
var result = service.SaveOrder(order);

ShowAlerts(result.Alerts);
if (result.Alerts.HasErrors)
return;

Console.WriteLine(result.ReturnedValue);
//////////////////////////////////////////////////
}

static void SaveOrder2()
{
var order = new Order();
var service = new MyService();

//////////////////////////////////////////////////
// Usage of service method marked as OPTION 2
//////////////////////////////////////////////////
AlertCollection alerts;
var orderID = service.SaveOrder(order, out alerts);

ShowAlerts(

Solution

Your 1st Option looks better to me, however need some modifictions:

  • Validate data before sending to service.



-
Change SaveOrder1 method

if (result.Alerts.HasErrors) {
    ShowAlerts(result.Alerts); 
    return;
}


-
move HasErrors to result, rather than Alerts

  • put business validation on service, like if minimum total should be greater than xxx etc



-
Change HasErrors to (if you move HasErrors to result, the code will be this.Alerts.Any()

public bool HasErrors
{
    get { return this.Any(); }
}


  • wrap your service code in try catch and set "Unhandled Exception" with generic message in Alerts

Code Snippets

if (result.Alerts.HasErrors) {
    ShowAlerts(result.Alerts); 
    return;
}
public bool HasErrors
{
    get { return this.Any(); }
}

Context

StackExchange Code Review Q#37516, answer score: 4

Revisions (0)

No revisions yet.