Mark Seeman đã làm đúng. Và tôi thông cảm với sự nhầm lẫn của bạn. Tôi đã tự mình trải qua khi tôi học cách sử dụng các thùng chứa phụ thuộc tự động. Vấn đề là có nhiều cách hợp lý và hợp lý để thiết kế và sử dụng các đối tượng. Tuy nhiên, chỉ một số phương pháp tiếp cận làm việc với các thùng chứa phụ thuộc tự động.
Lịch sử cá nhân của tôi: Tôi đã học các nguyên tắc OO về xây dựng đối tượng và Inversion Of Control từ lâu trước khi tôi học cách sử dụng các hộp chứa Inversion of Control như Unity hoặc Castle Windsor. Tôi có thói quen viết mã như sau:
public class Foo
{
IService _service;
int _accountNumber;
public Foo(IService service, int accountNumber)
{
_service = service;
_accountNumber = accountNumber;
}
public void SaveAccount()
{
_service.Save(_accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service(),1234);
foo.Save();
}
}
Trong thiết kế này, lớp Foo của tôi chịu trách nhiệm lưu tài khoản vào cơ sở dữ liệu. Nó cần một số tài khoản để làm điều đó và một dịch vụ để làm công việc bẩn thỉu. Điều này hơi giống với các lớp cụ thể mà bạn đã cung cấp ở trên, trong đó mỗi đối tượng có một số giá trị duy nhất trong hàm tạo. Điều này làm việc tốt khi bạn khởi tạo các đối tượng bằng mã của riêng bạn. Bạn có thể chuyển các giá trị thích hợp vào đúng thời điểm.
Tuy nhiên, khi tôi tìm hiểu về các thùng chứa phụ thuộc tự động, tôi thấy rằng tôi không còn instantiating Foo bằng tay nữa. Các container sẽ nhanh chóng các đối số constructor cho tôi. Đây là một tiện ích tuyệt vời cho các dịch vụ như IService. Nhưng nó rõ ràng không hoạt động tốt cho các số nguyên và chuỗi và tương tự. Trong những trường hợp đó, nó sẽ cung cấp một giá trị mặc định (như số không cho một số nguyên).Thay vào đó, tôi đã quen với việc đi qua trong bối cảnh giá trị cụ thể như số tài khoản, tên, vv ... Vì vậy, tôi đã phải điều chỉnh phong cách của tôi về mã hóa và thiết kế là như thế này:
public class Foo
{
IService _service;
public Foo(IService service)
{
_service = service;
}
public void SaveAccount(int accountNumber)
{
_service.Save(accountNumber);
}
}
public class Program
{
public static void Main()
{
Foo foo = new Foo(new Service());
foo.Save(1234);
}
}
Dường như cả hai Các lớp Foo là thiết kế hợp lệ. Nhưng thứ hai là có thể sử dụng với việc tiêm phụ thuộc tự động, và lần đầu tiên là không.
Nguồn
2010-09-04 11:41:12
làm cách nào để lưu trữ các tệp này trong tệp cấu hình thay vì mã hóa cứng? –