2013-03-07 17 views
5

Vì vậy, Đảo ngược kiểm soát là một mô tả mơ hồ, do đó Tiêm phụ thuộc trở thành định nghĩa mới. Đây là một giải pháp rất, rất mạnh và hoàn toàn có thể gây nhầm lẫn cho người chưa bao giờ gặp phải.Năm W của DI, IoC bởi vì nó làm cho bộ não của tôi phát nổ

Vì vậy, trong nhiệm vụ của tôi không phải là một con nai trong đèn pha, tôi đọc lên. Tôi tìm thấy một số cuốn sách tuyệt vời và bài đăng trực tuyến. Nhưng cũng giống như tất cả những điều tuyệt vời, nhiều câu hỏi nảy sinh hơn là câu trả lời.

Sự cố, hấp thụ các biến từ một dự án không xác định được triển khai sau khi chúng được đưa vào dự án của tôi.

Giải pháp:

public interface ISiteParameter 
{ 
    Guid CustomerId { get; set; } 
    string FirstName { get; set; } 
    string LastName { get; set; } 
    string Phone { get; set; } 
} 

injector của tôi:

public interface IInjectSiteParameter 
{ 
    void InjectSite(ISiteParameter dependant); 
} 

Sau đó, tôi tạo này:

public class SiteContent : IInjectSiteParameter 
{ 
    private ISiteParameter _dependent; 

    #region Interface Member: 
    public void InjectSite(ISiteParameter dependant) 
    { 
     _dependant = dependant; 
    } 
    #endregion 
} 

Sau đó, để thực hiện nó với một Shared tham khảo được biến Chán Tôi đã tạo một lớp học để được triển khai như:

public class SiteParameters : ISiteParameter 
{  
    public Guid Customer Id { get; set; } 
    public string FirstName { get; set; } 
    public string LastName { get; set; } 
    public string Phone { get; set; } 
} 

Bây giờ, SiteParameters Class sẽ được tham chiếu bởi dự án khác; mà sẽ cho phép tôi thực sự gọi những đặc tính bất cứ khi nào và bất cứ nơi nào với:

ISiteParameter i = new ISiteParameter(); 
MessageBox.Show(i.Guid + i.FirstName + i.LastName + i.Phone); 

Đó là việc thực hiện, nhưng câu hỏi của tôi là thế này ... Khi nào tôi để tôi sử dụng không?

  • Constructor tiêm
  • setter injection
  • Interface tiêm

Khi bạn sẽ sử dụng một hay khác? Và đối với công việc tôi đã đề cập nên tôi thực hiện một nhiệm vụ khó khăn như vậy để điều chỉnh cho bất kỳ thay đổi nào được thực hiện cho dự án khác?

Tôi có rơi ra khỏi đường cong trong quá trình suy nghĩ của mình không?

+0

tôi khen đột phá của bạn vào DI, thực sự nó là mạnh mẽ. Như bạn đã có nó thiết lập chưa có nhiều lợi ích hơn chỉ đơn giản là đi qua các giá trị cụ thể thông qua chữ ký cho phương pháp của bạn. Sức mạnh thực sự sẽ phát sinh khi cá thể ISiteParameter của bạn giữ các phương thức xác định cụ thể cho hành vi của nó, ngoài các cá thể ISiteParameter khác. – KodeKreachor

+0

@KodeKreachor Tôi đang suy nghĩ về cách thực hiện một số lợi ích đó. Nhưng tôi là một trinh nữ DI/IoC. – Greg

+0

Gotta chỉ ra bạn đang cố gắng để khởi tạo một 'giao diện' .. –

Trả lời

3

Kéo từ chương 4 của Dependency Injection in .NET bằng cách tiêm Constructor Đánh dấu SEEMANN

nên là sự lựa chọn mặc định của bạn cho DI. Nó giải quyết kịch bản phổ biến nhất trong đó một lớp đòi hỏi một hoặc nhiều phụ thuộc. Nếu lớp tùy chọn hoàn toàn không thể hoạt động mà không có sự phụ thuộc bảo đảm có giá trị.

Chỉ được phép sử dụng thuộc tính khi lớp bạn đang phát triển có mặc định địa phương tốt và bạn vẫn muốn cho phép người gọi cung cấp các triển khai khác nhau về sự phụ thuộc của lớp. Tiêm thuộc tính cũng có thể được sử dụng trong trường hợp các khung công tác yêu cầu bạn phải có các hàm tạo mặc định, như các trang ASP.NET.

Phương pháp tiêm được sử dụng tốt nhất khi phụ thuộc có thể thay đổi theo từng cuộc gọi phương thức.Điều này có thể là trường hợp khi chính sự phụ thuộc đại diện cho một giá trị, nhưng thường được nhìn thấy khi người gọi muốn cung cấp cho người tiêu dùng thông tin về ngữ cảnh trong đó hoạt động đang được gọi.

+0

Tôi sẽ đào sâu hơn nữa vào lỗ thỏ bằng cách đọc đó. – Greg

1

Bất cứ nơi nào có thể, tôi sử dụng Constructors để vượt qua depdendencies, thay vì tiêm thông qua một cuộc gọi phương thức.

Ví dụ:

public interface IWebHost 
{ 
    string DoSomething(string input); 
} 

public class FooManager 
{ 
    private IWebHost _host; 
    public FooManager(IWebHost host) 
    { 
     _host = host; 
    } 

    public void Process() 
    { 
     // do something with _host 
    } 
} 

Có một số lợi ích này, nhưng hai tôi thấy có lợi nhất:

  • phụ thuộc của tôi đang định lên phía trước, có ít cơ hội của một bị bỏ lỡ.
  • Tôi có thể sử dụng kho lưu trữ Dependency Injection để tự động xây dựng cho tôi.

Có những trường hợp không thể hoặc không thực tế để thực hiện việc này, nhưng hầu hết trong số chúng có thể được thực hiện xung quanh bằng cách tiêm Nhà máy xây dựng cho tôi.

Một ví dụ khác:

public interface IConnection : IDisposable 
{ 
    string DoSomething(string input); 
    // implement IDisposable 
} 

public interface IConnectionFactory 
{ 
    IConnection CreateConnection(); 
} 

public class DerpConnection : IConnection 
{ 
    // implementation 
} 

public class DerpConnectionFactory : IConnectionFactory 
{ 
    // We only return DerpConnections from this factory. 

    IConnection CreateConnection() { return new DerpConnection(); } 
} 

public class BarManager 
{ 
    private IConnectionFactory _connectionFactory; 
    public BarManager(IConnectionFactory connectionFactory) 
    { 
     _connectionFactory = connectionFactory; 
    } 

    public void Manage() 
    { 
     using(var connection = _connectionFactory.CreateConnection()) 
     { 
     // do something here. 
     } 
    } 
} 

Khung DI chỉ cần biết về IConnectionFactory trong ví dụ này, và việc thực hiện Nhà máy trực tiếp xây dựng các DerpConnection. Trong thử nghiệm đơn vị, tôi có thể giả lập nhà máy và phản ứng IConnection dễ dàng.

kịch bản nơi này là không thể, thường chỉ ra một số loại cross-cutting concern, hoặc lớp là rất nhiều phức tạp hơn nó cần phải được (và đang vi phạm SRP)

+0

Cảm ơn bạn Sẽ, tôi sẽ xem xét điều này. – Greg

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