2015-12-10 25 views
6

Hãy giả sử chúng ta có một giao diện IConfiguration rất đơn giản mà trách nhiệm trả lại một chuỗi kết nối thích hợpánh xạ container IoC: singleton vs từng gọi tạo

interface IConfiguration 
{ 
    string ConnectionString {get;} 
} 

và cho phép giả định chỉ có một thể hiện của kiểu đó thực hiện giao diện như vậy có thể được sử dụng (vì nó chỉ trả về một chuỗi, không quản lý trạng thái, vv)

Vì vậy, có ít nhất hai cách giao diện có thể được đăng ký trong vùng chứa: loại yêu cầu, hoặc như là một đối tượng đơn lẻ cho tất cả các yêu cầu loại. Có sự khác biệt giữa các phương pháp (có lẽ lý do hiệu suất, thủ thuật quản lý cuộc đời, vv)

container.For<IConfiguration>().Use<ConfigurationImpl>(); 

vs

container.For<IConfiguration>().Singleton().Use<ConfigurationImpl>(); 

Trả lời

4

quản lý đời Object sử dụng container DI thường nắm tới:

  1. Singleton scoped (đôi khi container scoped)
  2. thoáng qua (theo yêu cầu từ container)
  3. mỗi đồ thị (context) (ví dụ: người dẫn chương trình/điều khiển trong các ứng dụng máy tính để bàn, phiên trong các ứng dụng web/máy chủ web)

Tôi kêu gọi bạn đọc Đánh dấu Seemanns xuất sắc cuốn sách Dependency Injection in .Net. Nó đã chương đặc biệt dành riêng cho đối tượng quản lý cuộc đời .

Nói chung, bạn an toàn chỉ với giao tiếp người dùng và singleton là tốt cho các lý do hiệu suất hoặc chia sẻ trạng thái. Bạn cũng phải lưu ý cẩn thận về cách tài nguyên của bạn đang được xử lý.

Nếu bạn có một khuôn khổ ngụ ý một số thiết kế, bạn có thể sử dụng các phần của khung này làm ngữ cảnh cho toàn bộ thời gian của cá thể.

Ví dụ: bạn có 2 dbcommands được sử dụng bởi bộ điều khiển mvc asp để bạn có thể chia sẻ dbsession giữa chúng bằng cách làm cho cuộc sống dbsession gắn liền với tuổi thọ bộ điều khiển.

Có nhiều cách khác để quản lý tuổi thọ của đối tượng - như được gộp chung, tải chậm hoặc tương lai, nhưng chúng ít được sử dụng hơn lần đầu tiên 3. Đọc trên Mark Seemann về điều đó.

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