2009-11-06 33 views
9

Đây là những gì tôi muốn từ DI container:Những container DI sẽ làm hài lòng này

public class Class 
{ 
    public Class(IDependency dependency, string data) { } 
} 

var obj = di.Resolve<Class>(() => new Class(null, "test")); 

điểm đáng chú ý:

  1. có thể giải quyết tất cả phụ thuộc và dữ liệu trong constructor.
  2. Có thể sử dụng cú pháp loại an toàn để truyền tham số hàm tạo (cú pháp chính xác có thể thay đổi). Có, tôi có thể làm điều đó bản thân mình bằng cách nhận được đối số constructor từ (Expression.Body như NewExpression) - nhưng tôi sẽ cần một cách để phát hiện những đối số được đăng ký trong container.

Một yêu cầu chính khác là tôi muốn các thành phần của mình được tự động chọn, tức là tôi không muốn đăng ký lớp - tôi muốn IoC chọn nó vì nó biết cách giải quyết tính phụ thuộc.

Ngoài ra, thuộc tính có thể hữu ích đôi khi, nhưng điều này là tùy chọn.

Câu hỏi thực sự là về sự kết hợp các tính năng - để có tất cả chúng - loại an toàn, thông số, tự động đón ... Thật dễ dàng để kiểm tra một tính năng, nhưng kết hợp chúng không dễ xác minh trừ khi ai đó quen thuộc với container cụ thể và biết các tính năng của nó. Vì vậy, câu hỏi.

+0

Tôi không nghĩ có bất kỳ vùng chứa nào hỗ trợ loại cú pháp đó. Nhưng nhiều (gần như tất cả) container hỗ trợ các tham số container rõ ràng, và có lẽ với cú pháp rõ ràng hơn. –

+0

"Có lẽ" không phải là câu trả lời ... theo như tôi biết tôi có thể truyền đối tượng [] mảng tham số nhưng rõ ràng là không an toàn kiểu ... Tôi có thể thay đổi thứ tự tham số và sẽ không biết điều này cho đến khi chạy . – queen3

+0

Bởi sạch hơn tôi có nghĩa là bạn không cần phải sử dụng một cách rõ ràng ctor trong mã của bạn, giống như bạn làm ở trên. Thay vì những gì bạn đã viết, tại sao không: 'var obj = new Class (di.Resolve ()," test ");'? –

Trả lời

27

Tôi nghĩ bạn sẽ tốt hơn bằng cách xác định Nhà máy trừu tượng có thể tạo lớp học của bạn.

public interface IFactory 
{ 
    MyClass Create(string data); 
} 

Sau đó, bạn có thể tạo ra một thực hiện IFactory như thế này:

public class MyFactory : IFactory 
{ 
    private IDependency dependency; 

    public MyFactory(IDependency dependency) 
    { 
     if (dependency == null) 
     { 
      throw new ArgumentNullException("dependency"); 
     } 

     this.dependency = dependency; 
    } 

    #region IFactory Members 

    public MyClass Create(string data) 
    { 
     return new MyClass(this.dependency, data); 
    } 

    #endregion 
} 

Trong container của bạn, bạn sẽ đăng ký cả MyFactory và thực hiện các IDependency.

Bây giờ bạn có thể sử dụng các container để giải quyết các Nhà máy, và các nhà máy để lấy các lớp:

var mc = container.Resolve<IFactory>().Create(data); 

Cách tiếp cận này là hoàn toàn loại an toàn và độc đáo tách riêng các phụ thuộc từ dữ liệu ứng dụng thời gian chạy.

+0

Chính xác! ...................... –

+7

Điểm thưởng để gọi nó bằng tên Abstract Factory, nhưng sử dụng giao diện.Tôi đã nhìn thấy rất nhiều người khi họ nghe * Tóm tắt * Nhà máy đi thẳng đến lớp cơ sở trừu tượng. –

+2

Có, tôi biết điều này, mặc dù trong trường hợp của tôi, tôi ngần ngại vì các trường hợp đơn giản, nó quá mức cần thiết để tạo bản sao với giao diện, nhà máy, nhà xây dựng của nhà máy, Phương pháp tạo, v.v. suy nghĩ. Và câu hỏi vẫn còn về đăng ký DI container tự động. – queen3

Các vấn đề liên quan