2011-01-06 34 views
26

Ai đó có thể giải thích cho tôi khái niệm về một Container Thống nhất như tôi là một đứa trẻ 6 tuổi không? Nó hoạt động như thế nào và nó làm gì?WPF/Lăng kính: Container UNITY là gì?

+2

Nó không quá nhiều để có hộp chứa Unity, nhưng 'Unity' là tên của thùng chứa phụ thuộc (DI). Prism cũng đi kèm với MEF và hỗ trợ bất kỳ thùng chứa DI nào khác. Đoàn kết chỉ đến trước. Nếu bạn muốn đọc về sự khác biệt giữa Unity và MEF, hãy đọc phần có liên quan tại http://msdn.microsoft.com/en-us/library/ff921140(v=PandP.40).aspx. – Pat

+0

@Pat, MEF là một khung trình cắm thêm trong khi Unity là một vùng chứa DI thực sự. –

Trả lời

47

Đây là mô tả kỹ thuật hơn về nền, tôi hy vọng bạn vẫn thấy hữu ích.

Nói chung, đây là hộp chứa DI (phụ thuộc tiêm).

Với lớp sau đây:

public class Sample 
{ 
    Service a; 

    public Sample() 
    { 
    a = new Service(); 
    } 
} 

Vấn đề với đó là nó khởi phiên bản riêng của mình Service, làm cho nó rất khó để điều chỉnh những thay đổi mã (tức là nếu bạn muốn trao đổi Service với một cái gì đó. khác nhau). Ngoài ra nó làm cho thử nghiệm khó khăn.

Để giải quyết điều đó, không thực sự tạo ra nó cho mình, nhưng nhận được nó từ bên ngoài:

public class Sample 
{ 
    Service a; 

    public Sample(Service aService) 
    { 
    a = aService; 
    } 
} 

Bây giờ bạn đã thực hiện việc tạo ra khỏi lớp học mà bạn chỉ có thể đặt nó ở đó từ bên ngoài , tăng khả năng kiểm tra và bảo trì. Tuy nhiên, bạn vẫn có một sự phụ thuộc vào lớp Service. Bạn không thực sự quan tâm đến lớp cụ thể đó, nhưng trong hành vi mà nó cung cấp - do đó bạn tạo ra giao diện từ nó.

public class Sample 
{ 
    IService a; 

    public Sample(IService aService) 
    { 
    a = aService; 
    } 
} 

Bây giờ, bạn có thể thay thế dịch vụ bằng bất cứ thứ gì bạn muốn. Ví dụ, bạn có một lớp nhận dữ liệu từ một máy chủ bằng cách sử dụng một dịch vụ. Bây giờ, bạn chỉ muốn kiểm tra phân tích dữ liệu chứ không phải dịch vụ tìm nạp dữ liệu - chỉ cần tạo một lớp thực hiện giao diện, phục vụ dữ liệu tĩnh - đã hoàn tất!

Bây giờ, Unity sẽ được phát. Hiện tại, bạn phải tự mình giải quyết các phụ thuộc. đoàn kết gì là đơn giản - phải mất tất cả các lớp học có dependendencies và giải quyết những - vì vậy bạn chỉ có thể gọi số (mã giả, tôi không biết đoàn kết):

UnityContainer uc = new UnityContainer(); 
var a = uc.GetService<IService>(); 

Và nó giúp bạn lớp dễ dàng sử dụng được.

Chúng ta đã đạt được điều gì bằng cách đó?

  • mã là dễ bảo trì hơn vì bạn không dựa trên các loại cụ thể
  • mã là kiểm chứng hơn
  • ứng dụng có thể dễ dàng mở rộng

Như một bản tóm tắt: nó giúp tạo tốt hơn ứng dụng nhanh hơn.

+1

Dịch vụ có được Instanced khi nó được thêm vào Container hoặc khi phương thức GetService được gọi không? Nếu bạn yêu cầu cùng một dịch vụ ở hai nơi khác nhau nhưng từ cùng một cá thể Unity bạn sẽ nhận được cùng một đối tượng hoặc các cá thể riêng biệt? –

+1

Tôi xin lỗi, tôi không thể nói với bạn rằng, tôi chưa từng sử dụng Unity trước đây. Nói chung, nó phụ thuộc vào việc thực hiện các container/khung. Có một cái nhìn trong tài liệu, có phải là một mô tả về điều này. Ngoài ra, một số thùng chứa cung cấp cho bạn khả năng xác định hợp đồng trọn đời, vì vậy bạn có thể có các cá thể singleton (luôn giống nhau) hoặc các phiên bản mới cho mỗi yêu cầu. Như đã nói, phụ thuộc hoàn toàn vào container. – Femaref

+0

Ok Tôi đã đọc các phần của hướng dẫn Unity và điều này có vẻ rất cấu hình vì vậy tôi đoán bạn có thể làm điều đó như thế nào bạn thích. –

33

Container hợp nhất giống như một lọ đầy đủ các cookie, khi bạn cần một cookie, bạn chỉ cần yêu cầu cung cấp cho bạn một cookie.

Mỗi cookie được có một số đức tính như bạn có thể có một cookie nhưng bạn không thể ăn nó vì nó là rất khó để ăn (giống như singleton)

khi mẹ của bạn tạo ra một cookie mới, cô chỉ cần đặt cookie đó trong lọ thay vì tặng bạn trực tiếp!

+16

có vẻ như là câu trả lời của một đứa trẻ 6 tuổi. :) –

+0

yup;), OP hỏi theo cách đó! – TalentTuner

+3

Trong sự tương tự này đóng vai trò của người mẹ? – atiyar

7

tôi khuyên bạn nên xem Mike Taulty's Prism video series

Hai chương đầu tiên sẽ trả lời câu hỏi của bạn, và bạn có thể xem các chương khác để học Prism (mặc dù phiên bản của nó 2 và khá cũ, các nguyên tắc cơ bản vẫn giữ nguyên .. .)

Chúc may mắn :)