Windsor castle Injecting properties of constructed object

后端 未结 3 2060
刺人心
刺人心 2020-12-03 19:46

Some dependency injection containers enable you to inject configured services into an already constructed object.

Can this be achieved using Windsor, whilst taking

相关标签:
3条回答
  • 2020-12-03 19:58

    This is an old question but Google led me here recently so thought I would share my solution lest it help someone looking for something like StructureMap's BuildUp method for Windsor.

    I found that I could add this functionality myself relatively easily. Here is an example which just injects dependencies into an object where it finds a null Interface-typed property. You could extend the concept further of course to look for a particular attribute etc:

    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);
                }
            }
        }
    }
    

    Here is a simple unit test for this method:

    [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
        {
        }
    }
    
    0 讨论(0)
  • 2020-12-03 20:10

    No, it can't.

    0 讨论(0)
  • 2020-12-03 20:17

    As Krzysztof said, there is no official solution for this. You might want to try this workaround though.

    Personally, I consider having to do this a code smell. If it's your code, why isn't it registered in the container? If it isn't your code, write a factory/adapter/etc for it.

    0 讨论(0)
提交回复
热议问题