2010-04-29 37 views
6

Tôi đang cố gắng tìm ra cách giải quyết một cá thể ở đâu đó trong mã.Giải quyết cá thể - Autofac

Đồng khởi động ứng dụng tôi đã đăng ký một loại

static void Main() 
{  
    var builder = new ContainerBuilder(); 
    builder.RegisterType<Foo>().As<IFoo>(); 
} 

Bây giờ, làm thế nào tôi có thể giải quyết một thể hiện đâu đó trong mã?

Trong StructureMap có một đối tượng tĩnh ObjectFactory.GetInstance<IFoo>()

Trả lời

10

Đọc trên Getting Started. Nó sẽ giúp bạn bắt đầu.

Trước hết, những gì bạn đang tìm kiếm là container. Xây dựng nó từ ContainerBuilder như trong ứng dụng WinForms đơn giản này:

static void Main() 
{ 
    using (var container = builder.Build()) 
    { 
     Application.EnableVisualStyles(); 
     Application.SetCompatibleTextRenderingDefault(false); 

     var mainForm = container.Resolve<MainForm>(); 
     Application.Run(mainForm) 
    } 
} 

Ý tưởng chung là bạn chỉ phải giải quyết đầu tiên hoặc dụ trên cùng. Container sẽ xử lý việc tạo tất cả các cá thể khác dựa trên việc tiêm phụ thuộc thông qua các tham số của hàm tạo.

Nếu mẫu DI được theo dõi trong suốt ứng dụng của bạn, bạn chỉ phải chạm vào vùng chứa khi khởi động.

Cách bạn giải quyết trường hợp trên cùng phụ thuộc phần lớn vào loại ứng dụng bạn đang xây dựng. Nếu ứng dụng web của nó, số ASP.Net integrationMVC integration sẽ xử lý ứng dụng đó cho bạn. (Sau khi tất cả, trường hợp trên cùng trong ASP.Net là Application là ngoài tầm kiểm soát của chúng tôi).

Mặt khác, nếu ứng dụng giao diện điều khiển hoặc ứng dụng WinForms, bạn sẽ giải quyết thủ tục đầu tiên theo cách thủ công trong Main, như mẫu của tôi ở trên.

+0

Đó là ví dụ, nhưng nếu tôi cần một cá thể trong nhiều lớp học thì sao? Không thể đăng ký loại trong mỗi lớp. – user137348

+1

Nhưng bạn phải bằng cách nào đó giải quyết trường hợp trên cùng này ở đâu đó trong mã. Các loại được đăng ký lúc khởi động (Global.asax) và sau đó bạn cần phải giải quyết trường hợp trên cùng ở đâu đó trong mã. Cuối cùng, tôi đã tìm thấy một bài viết giải thích điều này. http://geekswithblogs.net/Sharpoverride/archive/2009/08/15/ioc-in-.net-part-1-autofac.aspx Bạn nghĩ gì về phương pháp này? – user137348

+0

Xem câu trả lời cập nhật của tôi ... và có, cách tiếp cận @Sharpoverrides là ok, nó đảm bảo rằng Global.asax không lộn xộn với mã xây dựng vùng chứa. Sau khi tất cả, bạn thực sự nên viết unittests rằng kiểm tra các container, và có một lớp trách nhiệm duy nhất xây dựng các container làm cho nó dễ dàng hơn để kiểm tra. –

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