2008-11-11 21 views
9

Tôi chỉ mới bắt đầu với các container IoC để xin lỗi nếu đây là một câu hỏi ngu ngốc.Có một container IoC thay thế việc sử dụng các Nhà máy

tôi có mã như sau trong một ứng dụng

internal static class StaticDataHandlerFactory 
    { 
     public static IStaticDataHandler CreateHandler(StaticDataUpdate staticDataUpdate) 
     { 
      if (staticDataUpdate.Item is StaticDataUpdateOffice) 
      { 
       return new OfficeUpdateHandler(); 
      } 

      if (staticDataUpdate.Item is StaticDataUpdateEmployee) 
      { 
       return new EmployeeUpdateHandler(); 
      } 

      if (staticDataUpdate.Item == null) 
      { 
       throw new NotImplementedException(
        string.Format("No static data provided")); 
      } 
      else 
      { 
       throw new NotImplementedException(
        string.Format("Unimplemented static data type of {0}", staticDataUpdate.Item.GetType().FullName)); 
      } 
     } 
    } 

Nó cơ bản là một nhà máy đơn giản mà trả về chiến lược đúng đắn để xử lý các dữ liệu đầu vào.

Vùng chứa IoC có cho phép tôi loại bỏ mã như thế này không? Đó là để nói: nó sẽ cho phép tôi tự động chọn một thực hiện cụ thể để tải dựa trên loại của một tham số đầu vào?

Hoặc tôi có thể tham gia khóa học ở đây không?

Trả lời

7

Thực ra, mặc dù có thể thay thế một số mã bằng cách đảo ngược hệ thống điều khiển, nhưng không rõ ràng với tôi đó là một ý tưởng hay. Dependency injection có xu hướng tốt nhất cho cấu hình của các hệ thống, không phải là việc tạo các đối tượng động. Để đặt nó theo một cách khác, bản thân vùng chứa là một biến toàn cục lớn và như vậy sẽ xuất hiện trong phần lớn mã của bạn.

Ngoài ra, mã dường như vi phạm Law of Demeter. Có vẻ thông số phải thuộc loại "StaticDataUpdateItem" thay vì "StaticDataUpdate". Với quan sát đó, có một đối số khá mạnh để viết lại đoạn mã này như một lời gọi phương thức trên StaticDataUpdateItem.

Tôi đã sử dụng IoC khá nhiều, nhưng việc tạo đối tượng động vẫn được xử lý tốt hơn bằng cách sử dụng mẫu nhà máy trừu tượng. Tóm lại, nếu bạn không thích ý tưởng thêm phương thức vào chính mục đó để tạo ra xử lý, thì mã có lẽ là tốt nhất còn lại theo cách của nó.

0

Câu trả lời ngắn gọn là có, nó cho phép nó. Điều này blog post cho thấy một cách khéo léo để lựa chọn thực hiện tại thời gian chạy bằng cách sử dụng Windsor. Tác giả, Ayende, xây dựng herehere.

Tôi chưa thử điều này, nhưng tôi dự kiến ​​sẽ sớm.

2

Bạn hoàn toàn không xa; theo cách tôi hiểu, bạn khá thân thiết. Cách thức tôi thường cấu trúc loại thứ này là biến lớp Nhà máy thành container IoC của bạn, chỉ đơn giản bằng cách cho phép UpdateHandlers được trả về được chỉ định bằng cách sử dụng Dependency Injection. Vì vậy, thay vì có logic trong mã của bạn chỉ định rằng StaticDataUpdateOffice có nghĩa là trả về OfficeUpdateHandler, bạn có thể biến mã của bạn thành chỉ đơn giản là nói rằng StaticDataUpdateOffice trả về bất kỳ biến (mới được chỉ định) m_officeUpdateHandler chứa; miễn là Khung của bạn đảm bảo rằng bạn đặt giá trị là m_officeUpdateHandler trước khi bạn gọi nhà máy của mình, bạn tốt để đi. Và bạn có thể thay đổi giá trị của m_officeUpdateHandler thành bất kỳ thứ gì bạn muốn trong thời gian chạy khi nhu cầu của bạn thay đổi.

Tính năng Dependency Injection này cho phép bạn kiểm soát quá trình Đảo ngược kiểm soát; bạn có thể có một nhà máy đơn giản trả về các trình xử lý của bạn và bạn có thể tóm tắt logic điều khiển trình xử lý nào được trả về một vị trí khác, nếu thích hợp.

Lưu ý: kinh nghiệm của tôi với loại điều này là khá mạnh mẽ bởi kinh nghiệm của tôi (rất tích cực) với mùa xuân, và do đó có thể tô màu giải thích của tôi về câu hỏi của bạn (và câu trả lời).

0

Tôi đồng ý với các câu trả lời khác ở đây, có, bạn có thể thực hiện theo cách đó. Nhưng, tại sao bạn không sử dụng một chung chung?

public static IStaticDataHandler CreateHandler<T>(params object[] args) 
{... 

nơi args có thể được chuyển vào dưới dạng đối số ctor (tới, ví dụ: Activator).

+1

Vì generics được giải quyết lúc biên dịch - anh ấy đưa ra quyết định dựa trên loại Item đang được vận chuyển như hàng hóa, quyết định thời gian chạy. – Bevan

+1

Bạn không cần phải giải quyết generics tại thời gian biên dịch. Nhìn vào Type.MakeGenericType() nếu bạn không tin tôi. – dviljoen

-2

Tôi chưa đọc bất kỳ từ nào ở đây có ý nghĩa nhiều.

IoC có nhiều cấu hình hơn?

Tạo đối tượng động tốt hơn? Generics? Đây là tất cả các chủ đề.

1) IoC không là gì ngoài một trình tiết kiệm thời gian tuyệt vời so với việc triển khai 'thành phần về chuyên môn hóa/kế thừa' phúc âm.

Vì vậy, quy tắC# 1 cho việc sử dụng IoC là bạn nên thực sự mệt mỏi vì phải đối phó với các nhà thầu dài tuân theo 'ràng buộc với hợp đồng không thực hiện'.

Nói cách khác, đây là mô hình phân tầng như là sự thay thế trên mẫu khuôn mẫu cho cùng một lý do (đóng gói ...) ... NHƯNG có nhiều công việc hơn để tạo tất cả các loại giao diện/trừu tượng bổ sung và nó là làm việc nhiều hơn để làm điều đó EVERY thời gian với tất cả các IServiceProvicerThis và IResolverThat ... Nếu bạn không cảm thấy mệt mỏi vì phải tediously thực hiện hợp đồng mã như:

IInterestingService thú vị = ... bạn sẽ có được một thể hiện tuy nhiên ..

thêm khoảng ba dòng khác như thế này ..

sau đó

IAmazementDịch vụ dịch vụ = mới AmazementService (thú vị, mục tiêu thứ hai, thứ ba, v.v ...)

Điều đó cũ kỹ. Vì vậy, IoC không bao giờ là một câu hỏi bởi vì bất kỳ ai đủ thông minh để viết mã bằng cách sử dụng thiết kế chắc chắn sẽ biết rõ hơn. Những người yêu cầu có tất cả các câu trả lời sai.

Vì vậy, nếu thực sự bạn đáp ứng các điều trên thì tuyệt đối. IoC container đang trên móc để làm nhiều công việc 'sáng tạo' như bạn có thể hưởng lợi từ việc cho phép họ đối phó với. Và sự phá hoại sáng tạo phổ biến nhất trên trang web mới là Mr. Factory.

Damon

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