服務層不直接執行任何任務。它所做的就是合理的安排一些列你提供的業務對象。服務層很清楚業務邏輯層,也很清楚領域模型。例如:你使用數據庫表模型模式的業務邏輯層,服務層會通過DataSet來進行交互。
很顯然,服務層合理的安排業務組件,同時也合理的安排應用的服務、工作流和業務邏輯的其他組件。
服務層的職責
服務層是一個額外的層,是在兩個層之間設置一個邊界。
下面我們來舉例說明服務層的作用。通過表現層與業務邏輯的解耦來說明服務層的作用。我們還是以B2C中的購物流程來說。
我們定義的產品信息如下:
/// <summary> /<summary>
/// 產品信息
///
public class Product
{
/// <summary> /<summary>
/// 返回所有的產品信息
///
/// <returns>
public List<product> GetAll() /<product>
{
return new List<product>(); /<product>
}
/// <summary> /<summary>
/// 返回產品信息根據產品ID
///
/// <returns>
public Product GetByID(int ID)
{
return new Product();
}
}
產品信息中包含2個方法,一個是獲取所有產品的列表,還有一個是獲取實體的信息根據主鍵。我們來看看購物車的代碼:
/// <summary> /<summary>
/// 購物車
///
public class ShopCar
{
/// <summary> /<summary>
/// 購物車中的產品
///
Dictionary
/// <summary> /<summary>
/// 將指定產品ID的產品添加到購物車
///
public bool Add(int ID)
{
Product product = new Product();
product= product.GetByID(ID);
if (products.ContainsKey(ID))
return false;
products.Add(ID,product);
return true;
}
}
下面我們來看看前臺調用的代碼:
public class ShopCar
{
/// <summary> /<summary>
/// 將指定產品ID的產品添加到購物車
///
public bool Add(int ID)
{
ShopCar cart = new ShopCar();
return cart.Add(ID);
}
}
上面的代碼引用了ShopCar對象,說明UI層的ShopCar與業務層的ShopCar 有依賴關係,那麼我們如何解耦呢?通過引入第三方類,來實現依賴的解除。具體的代碼如下:
public class ShopCar
{
/// <summary> /<summary>
/// 將指定產品ID的產品添加到購物車
///
public bool Add(int ID)
{
IShopCar car;
CarFactory factory = new CarFactory();
car = factory.ShopCarFactory();
car.Add(ID);
return true;
}
}
修改後通過服務層中的購物車工廠構造出購物車實例,這樣就可以把業務邏輯層與界面層之間的耦合關係通過新增加一個服務層來實現解耦,那麼表現層的代碼更簡潔,也符合設計規範。
服務層在用戶接口和其它層之間提供了唯一的協議,使得你可以專注於應用邏輯。應用邏輯是業務邏輯的一部分,直接產生於用例。
在服務端,被執行的服務層方法,合理的安排了需要的邏輯,通過協調領域模型、特殊的應用服務、工作流。
沒有服務層,表現層就會直接調用業務邏輯層。完成一個任務,就可能需要進行多次的遠程調用。對於性能來說,這不是一件好事。(尚學堂)
閱讀更多 架構師之橋 的文章