Chúng tôi có một lớp logic nghiệp vụ (BLL) được kết hợp chặt chẽ với lớp truy cập dữ liệu của chúng tôi (DAL). Chúng tôi thực hiện cuộc gọi như thế này:
using (FooData data = new FooData())
{
data.DoSomething();
}
Điều quan trọng cần lưu ý là tất cả các lớp dữ liệu của chúng tôi đều internal
ở trong cùng một nhóm với các lớp logic, do đó chỉ BLL mới có thể truy cập DAL.
Để tách riêng những điều này (để giúp tạo điều kiện kiểm tra đơn vị), một ý tưởng là tạo các giao diện IDataClass, như IFooData. Lúc đầu, tôi nghĩ nó có thể là một vấn đề vì chúng ta phải công khai các lớp dữ liệu của mình để thực hiện các giao diện. Nhưng chúng ta có thể giữ các lớp dữ liệu bên trong, mặc dù chúng ta vẫn cần các phương thức được công khai:
public interface IFooData
{
void DoSomething();
}
internal class FooData : IFooData // Notice the class is internal
{
public void DoSomething(); // Method is public, but that's ok because class is internal
}
Vì vậy, mặc dù phương thức này là công khai, vì bản thân lớp là nội bộ, chúng ta vẫn chỉ cho phép truy cập BLL của mình.
Có bất cứ điều gì vốn đã sai với phương pháp này? Có cách nào tốt hơn để trừu tượng hóa DAL, để thử nghiệm đơn vị, mà không cần mở DAL ra thế giới bằng cách công khai nó không?