Theo nguyên tắc SOLID, một lớp không thể phụ thuộc vào các lớp khác, phụ thuộc phải được tiêm. Rất đơn giản:Đảo ngược phụ thuộc. Để tạo đối tượng
class Foo
{
public Foo(IBar bar)
{
this.bar = bar;
}
private IBar bar;
}
interface IBar
{
}
class Bar: IBar
{
}
Nhưng nếu tôi muốn lớp Foo của mình có thể tạo Bar, không biết việc triển khai chính xác đằng sau IBar thì sao? tôi có thể nghĩ ra 4 giải pháp ở đây, nhưng tất cả chúng dường như có nhiều nhược điểm:
- tiêm loại đối tượng và sử dụng phản ánh
- sử dụng Generics
- sử dụng "Dịch vụ Locator" và gọi Resolve () phương pháp.
- tạo ra một lớp nhà máy tách ra và tiêm nó vào Foo:
class Foo
{
public void DoSmth(IBarCreator barCreator)
{
var newBar = barCreator.CreateBar();
}
}
interface IBarCreator
{
IBar CreateBar();
}
class BarCreator : IBarCreator
{
public IBar CreateBar()
{
return new Bar();
}
}
trường hợp cuối có vẻ tự nhiên, nhưng BarCreator lớp có mã quá litle. Vậy bạn nghĩ thế nào, tốt nhất là gì?
Tùy chọn 4 là câu trả lời đúng: http://stackoverflow.com/questions/1943576/is-there-a-pattern-for-initializing-objects-created-via-a-di-container/1945023#1945023 –
Tuy nhiên, tại sao bạn muốn Foo tạo IBar? Hãy chú ý đến các sự trừu tượng bị rò rỉ. –