2009-05-12 25 views
5

Một số thùng chứa phụ thuộc cho phép bạn tiêm các dịch vụ được cấu hình vào một đối tượng đã được xây dựng.Lâu đài Windsor Tính chất tiêm của vật thể xây dựng

Điều này có thể đạt được bằng cách sử dụng Windsor, trong khi tính đến bất kỳ phụ thuộc dịch vụ nào có thể có trên đối tượng mục tiêu không?

+2

trùng lặp: http://stackoverflow.com/questions/447193 –

+0

Nó không phải là một bản sao của câu hỏi đó. Các câu hỏi được đề cập đến hỏi liệu windsor có thể giải quyết các đối tượng không được đăng ký. – PhilHoy

Trả lời

5

Không, không thể.

1

Như Krzysztof cho biết, không có giải pháp chính thức cho việc này. Bạn có thể muốn thử this workaround.

Cá nhân, tôi xem xét việc phải làm điều này một mùi mã. Nếu đó là mã của bạn, tại sao mã không được đăng ký trong vùng chứa? Nếu nó không phải là mã của bạn, hãy viết một nhà máy/adapter/etc cho nó.

+0

Tôi đồng ý - đó là một mùi. Tại sao bạn muốn làm điều đó ngay từ đầu? Đó là đồng bằng sai. –

+0

Tôi có một trường hợp khá đơn giản, nơi tôi cần phải làm điều này: – Steve

+0

Tôi tạo ra một thể hiện thông qua các container, sau đó tại một số điểm tôi serialize dụ của tôi. Tuy nhiên tôi không muốn serialize các phụ thuộc. Khi tôi deserialize tôi cần phải thêm các phụ thuộc trở lại vào đối tượng. Làm thế nào tôi sẽ giải quyết vấn đề này bằng cách sử dụng Castle Windsor? – Steve

9

Đây là một câu hỏi cũ nhưng Google đã dẫn tôi đến đây gần đây vì vậy tôi nghĩ rằng tôi sẽ chia sẻ giải pháp của tôi vì nó giúp ai đó tìm kiếm thứ gì đó như phương pháp BuildUp của BuildMap cho Windsor.

Tôi thấy rằng tôi có thể tự thêm chức năng này một cách tương đối dễ dàng. Dưới đây là một ví dụ mà chỉ tiêm phụ thuộc vào một đối tượng, nơi nó tìm thấy một null giao diện gõ thuộc tính. Bạn có thể mở rộng khái niệm nữa của khóa học để tìm kiếm một thuộc tính cụ vv:

public static void InjectDependencies(this object obj, IWindsorContainer container) 
{ 
    var type = obj.GetType(); 
    var properties = type.GetProperties(BindingFlags.Public | BindingFlags.Instance); 
    foreach (var property in properties) 
    { 
     if (property.PropertyType.IsInterface) 
     { 
      var propertyValue = property.GetValue(obj, null); 
      if (propertyValue == null) 
      { 
       var resolvedDependency = container.Resolve(property.PropertyType); 
       property.SetValue(obj, resolvedDependency, null); 
      } 
     } 
    } 
} 

Dưới đây là một thử nghiệm đơn vị đơn giản cho phương pháp này:

[TestFixture] 
public class WindsorContainerExtensionsTests 
{ 
    [Test] 
    public void InjectDependencies_ShouldPopulateInterfacePropertyOnObject_GivenTheInterfaceIsRegisteredWithTheContainer() 
    { 
     var container = new WindsorContainer(); 
     container.Register(Component.For<IService>().ImplementedBy<ServiceImpl>()); 

     var objectWithDependencies = new SimpleClass(); 
     objectWithDependencies.InjectDependencies(container); 

     Assert.That(objectWithDependencies.Dependency, Is.InstanceOf<ServiceImpl>()); 
    } 

    public class SimpleClass 
    { 
     public IService Dependency { get; protected set; } 
    } 

    public interface IService 
    { 
    } 

    public class ServiceImpl : IService 
    { 
    } 
} 
+2

Nhân tiện, Tôi cần chức năng này trong tiêm phụ thuộc vào một ActionFilter cho MVC.NET. –

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