Đâ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
{
}
}
Nguồn
2011-06-08 09:52:05
trùng lặp: http://stackoverflow.com/questions/447193 –
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