2010-07-12 43 views
9

Có cách nào để sử dụng tính năng Tiêm tài sản ở Ninject 2 mà không sử dụng thuộc tính [Inject] không? Điều này tạo ra sự phụ thuộc vào Ninject trong lớp sẽ được kết nối bằng cách sử dụng nó và tôi muốn tránh sự phụ thuộc không cần thiết vào container IoC của tôi, đó là lý do tại sao tôi sử dụng Constructor Injection thường xuyên hơn.Ninject 2.0: Tiêm thuộc tính không có thuộc tính

Tôi đoán cùng áp dụng cho phương pháp tiêm

Trả lời

7

Tôi đi theo tip Ruben và đăng tải một nhỏ blog post về cách đạt được điều này, nhưng đây là câu trả lời nhanh:

Tạo một thuộc tính tùy chỉnh:

public class InjectHereAttribute : Attribute 
{ 
} 

lớp mục tiêu bây giờ sẽ trông như thế này:

Bây giờ Ninject phải được cấu hình để sử dụng thuộc tính tùy chỉnh, điều này có thể được thực hiện bằng cách tạo ra một thực hiện IInjectionHeuristic công nhận thuộc tính tùy chỉnh:

public class CustomInjectionHeuristic : NinjectComponent, IInjectionHeuristic, INinjectComponent, IDisposable 
{ 
    public new bool ShouldInject(MemberInfo member) 
    { 
     return member.IsDefined(
      typeof(InjectHereAttribute), 
      true); 
    } 
} 

Và cuối cùng thêm hành vi này đến Ninject Kernel sử dụng bộ sưu tập thành phần, nó sẽ chạy dọc theo các thành phần hiện có, cụ thể là việc triển khai mặc định của IInjectionHeuristic, có nghĩa là thuộc tính mặc định hoặc thuộc tính tùy chỉnh có thể được sử dụng.

// Add custom inject heuristic 
kernel.Components.Add<IInjectionHeuristic, CustomInjectionHeuristic>(); 
+0

Liên kết không còn tồn tại (do đó minh họa tại sao tốt hơn là sao chép/dán và cung cấp tín dụng cho tác giả gốc, thay vì * chỉ * liên kết với bản gốc). Bạn có tài nguyên thay thế để mô tả câu trả lời gốc cho vấn đề này không? – BTownTKD

+0

@BTownTKD bạn nói đúng. Tôi đã thêm ví dụ vào câu trả lời và thay đổi liên kết bị hỏng. – t3mujin

+0

Cảm ơn! Điều này có vẻ rất hữu ích. – BTownTKD

4

Bạn có thể vượt qua trong một [Thuộc tính] gõ vào nhân khi tạo mà có thể được sử dụng thay cho InjectAttribute, nhưng bạn vẫn sẽ phải tham khảo một cái gì đó trực thuộc Trung ương OOTB. Có một câu hỏi tương tự gần đây về việc thực hiện PI mà không có thuộc tính - không có OOTB (như trực tiếp trên giao diện cấu hình thông thạo) để đặt vào máy quét tùy chỉnh nhưng điểm mở rộng (bạn thêm một thành phần thực hiện giao diện Ninject). khi bạn xây dựng Hạt nhân quyết định cách khía cạnh đó hoạt động như thế nào nếu tìm kiếm thuộc tính đã cho không phải là thứ bạn muốn) ở đó để xác định vị trí chèn dựa trên Công ước qua cấu hình - không có gì ngăn bạn sửa đổi quét chỉ dựa trên tên thuộc tính (vì vậy nó không nhất thiết phải sống ở vị trí trung tâm).

Lưu ý rằng, nói chung, constructor injection là tốt vì nhiều lý do dù sao, trong đó có một này, và giữ cho bạn chứa đang thuyết bất khả tri rất quan trọng (ngay cả khi bạn đang hài lòng với một!)

3

tôi đã có thể thực hiện điều này bằng cách sử dụng lớp Heuristic:

public sealed class MyInjectionHeuristic : NinjectComponent, IInjectionHeuristic 
{ 
     private static readonly IList<Type> 
      _propertyInjectible = 
       new List<Type> 
       { 
      typeof(IMyService), 
       }; 

        /// <summary> 
     /// Returns a value indicating whether the specified member should be injected. 
     /// </summary> 
     /// <param name="member">The member in question.</param> 
     /// <returns><c>True</c> if the member should be injected; otherwise <c>false</c>.</returns> 
     public bool ShouldInject(MemberInfo member) 
     { 
     var info = member as PropertyInfo; 

     if(member == null || info == null) 
     return false; 

     if (info.CanWrite) 
     return _propertyInjectible.Contains(info.PropertyType); 

     if(this.Settings == null) 
     return false; 

     var propList = member.GetCustomAttributes(this.Settings.InjectAttribute, true); 

     return propList.Length > 0; 
     } 
} 

Khi tạo kernel:

var heuristics = _kernel.Components.Get<ISelector>().InjectionHeuristics; 
    heuristics.Add(new MyInjectionHeuristic()); 

Simple thêm các loại bổ sung cho IList khi bạn muốn tiêm khác loại thông qua các thuộc tính.

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