2010-06-10 39 views
6

Trong một dự án WPF mới (VS2010), tôi sử dụng Unity 2 lần đầu tiên. Trong dự án này tôi sử dụng cấu trúc sau:Cách giải quyết sử dụng Unity trong giải pháp đột biến dự án

Giải pháp

WPF Dự án

Lớp library1

Lớp Library2

Class Library 3 ....

Đăng ký các loại khác nhau bằng cách sử dụng Unity được thực hiện trong Dự án WPF bằng cách sử dụng đoạn mã sau:

IUnityContainer container = new UnityContainer() 
          .RegisterType<IObjectContext, ObjectContextAdapter>() 
          .RegisterType<IConnectionStringProvider, ConnectionStringProvider>() 
          .RegisterType(typeof(IRepository<>), typeof(Repository<>)); 

Bây giờ hãy nói rằng tôi muốn nhận được Kho lưu trữ <Orders> giải pháp được xây dựng trong Thư viện lớp1. Rõ ràng container không được biết đến trong các dự án khác!

Tôi làm như thế nào?

Trả lời

9

Tôi chủ yếu đồng ý với câu trả lời của Chris, nhưng tôi nghĩ rằng tệp cấu hình là icky (đặc biệt là đối với Unity) vì vậy đây là giải pháp cho phép bạn sử dụng cấu hình thời gian chạy tham chiếu vòng tròn. Chúng ta sẽ làm điều này với các đăng ký.

Tạo dự án cơ sở hạ tầng chứa IConfigureUnity.

public interface IConfigureUnity 
{ 
    public void Configure(UnityContainer container); 
} 

Mỗi dự án thư viện lớp học của bạn sẽ chịu trách nhiệm triển khai giao diện này để đăng ký lớp riêng.

public class RegistryForSomeClassLibrary : IConfigureUnity 
{ 
    public void Configure(UnityContainer container) 
    { 
     container 
      .RegisterType<IObjectContext, ObjectContextAdapter>() 
      .RegisterType<IConnectionStringProvider, ConnectionStringProvider>() 
      .RegisterType(typeof(IRepository<>), typeof(Repository<>)); 
    } 
} 

Sau đó, trong dự án WPF của bạn, bạn sẽ cần tạo vùng chứa và áp dụng các đăng ký này.

var container = new UnityContainer(); 
new RegistryForSomeClassLibrary().Configure(container); 
new RegistryForAnotherClassLibrary().Configure(container); 

Bây giờ bạn có thể hiện vùng chứa được định cấu hình đầy đủ với bất kỳ tệp cấu hình nào.

+0

Giả sử tôi có một hộp thoại trong Thư viện lớp 1 có tên là "Quản lý người dùng". Làm thế nào để ManageUser nhận được cá thể của container được khai báo trong dự án WPF? –

+1

@Ryan - Có lý do nào để sử dụng giao diện trong một dự án chung không? Tại sao không làm cho lớp Registry và Configure method cả static và gọi nó như vậy: 'RegistryForSomeClassLibrary.Configure (container); RegistryForAnotherClassLibrary.Configure (vùng chứa); 'Tôi đã thử nghiệm nó và nó hoạt động. Tui bỏ lỡ điều gì vậy? – Shevek

+0

@Shevek, Điều đó hoạt động tốt. Tôi đã từng giải quyết các đăng ký của mình bằng cách sử dụng sự phản chiếu nhưng đã từ bỏ điều đó một thời gian. Bây giờ tôi gọi một cách rõ ràng 'Configure()' trên mỗi đăng ký. – Ryan

0

Để có nhiều dự án sử dụng cùng UnityContainer trong trường hợp này, bạn cần một dự án "chung" chứa UnityContainer của bạn và hiển thị nó sao cho tất cả các dự án khác có thể truy cập nó.

tức

Dự án WPF

Class Library 1

Class Library 2

Class Library 3

Thư viện chung (UnityContainer sống ở đây)

Để tránh hình tròn phụ thuộc dự án , Tôi khuyên bạn nên sử dụng Unity design-time configuration via a configuration file thay vì cấu hình thời gian chạy (như bạn có trong ví dụ của bạn). Nếu không, Thư viện chung của bạn sẽ phải tham khảo các dự án có chứa tất cả các kiểu mà nó giải quyết và các dự án đó sẽ phụ thuộc vào Thư viện chung (vì có lẽ bạn sẽ trưng ra cá thể UnityContainer). Bạn có thể làm cho nó hoạt động bằng cách sử dụng cấu hình thời gian chạy, nhưng tôi chưa thử; Tôi biết rằng cấu hình thiết kế thời gian hoạt động như tôi đã thực hiện một vài dự án bằng cách sử dụng một mô hình chính xác như thế này.

+0

Cảm ơn Chris, sẽ thử! –

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