Tôi có một ứng dụng web. Tôi không tin công nghệ là quan trọng. Cấu trúc là một ứng dụng N-tier, được hiển thị trong hình bên trái. Có 3 lớp.
UI (mẫu MVC), Lớp logic nghiệp vụ (BLL) và Lớp truy cập dữ liệu (DAL)
Vấn đề tôi gặp phải là BLL của tôi rất lớn vì nó có logic và đường dẫn thông qua các sự kiện ứng dụng gọi.
Một luồng thông thường thông qua ứng dụng có thể là:
Sự kiện được kích hoạt trong UI, đi qua một phương thức trong BLL, thực hiện logic (có thể ở nhiều phần của BLL), cuối cùng đến DAL, trở lại BLL (nơi có khả năng logic hơn) và sau đó trả lại một số giá trị cho UI.
BLL trong ví dụ này rất bận rộn và tôi đang nghĩ làm thế nào để tách nó ra. Tôi cũng có logic và các đối tượng kết hợp mà tôi không thích.
Phiên bản bên phải là nỗ lực của tôi.
Logic vẫn là cách ứng dụng chảy giữa UI và DAL, nhưng có thể không có thuộc tính ... Chỉ có các phương thức (phần lớn các lớp trong lớp này có thể có thể tĩnh vì chúng không lưu trữ bất kỳ trạng thái nào). Lớp Poco là nơi các lớp tồn tại có các thuộc tính (chẳng hạn như lớp Person nơi sẽ có tên, tuổi, chiều cao, v.v.). Chúng sẽ không liên quan gì đến dòng chảy của ứng dụng, chúng chỉ lưu trữ trạng thái.
Dòng chảy có thể là:
Thậm chí được kích hoạt từ UI và chuyển một số dữ liệu tới bộ điều khiển lớp UI (MVC). Điều này chuyển dữ liệu thô và chuyển đổi nó thành mô hình poco. Mô hình poco sau đó được chuyển vào lớp Logic (là BLL) và cuối cùng đến lớp truy vấn lệnh, có khả năng bị thao túng trên đường đi. Lớp truy vấn lệnh chuyển đổi POCO thành một đối tượng cơ sở dữ liệu (gần giống nhau, nhưng một lớp được thiết kế để duy trì, lớp kia cho giao diện người dùng). Mục này được lưu trữ và một đối tượng cơ sở dữ liệu được trả về lớp Truy vấn lệnh. Sau đó, nó được chuyển đổi thành POCO, nơi nó trở lại lớp Logic, có khả năng được xử lý thêm và cuối cùng, trở lại giao diện người dùng
Các logic và giao diện được chia sẻ là nơi chúng ta có thể có dữ liệu liên tục, chẳng hạn như MaxNumberOf_X và Total ALLowed_X và tất cả các giao diện.
Cả logic / giao diện được chia sẻ và DAL đều là "cơ sở" của kiến trúc. Những điều này không biết gì về thế giới bên ngoài.
Mọi thứ đều biết về poco ngoài logic / giao diện và DAL được chia sẻ.
Luồng vẫn rất giống với ví dụ đầu tiên, nhưng nó làm cho mỗi lớp có trách nhiệm hơn đối với 1 điều (có thể là trạng thái, luồng hoặc bất cứ điều gì khác) ... nhưng tôi có phá vỡ OOP bằng phương pháp này không?
Một ví dụ để demo Logic và Poco có thể là:
public class LogicClass
{
private ICommandQueryObject cmdQuery;
public PocoA Method1(PocoB pocoB)
{
return cmdQuery.Save(pocoB);
}
/*This has no state objects, only ways to communicate with other
layers such as the cmdQuery. Everything else is just function
calls to allow flow via the program */
public PocoA Method2(PocoB pocoB)
{
pocoB.UpdateState("world");
return Method1(pocoB);
}
}
public struct PocoX
{
public string DataA {get;set;}
public int DataB {get;set;}
public int DataC {get;set;}
/*This simply returns something that is part of this class.
Everything is self-contained to this class. It doesn't call
trying to directly communicate with databases etc*/
public int GetValue()
{
return DataB * DataC;
}
/*This simply sets something that is part of this class.
Everything is self-contained to this class.
It doesn't call trying to directly communicate with databases etc*/
public void UpdateState(string input)
{
DataA += input;
}
}