Questa è una vecchia domanda, ma Google mi ha condotto qui di recente, quindi ho pensato di condividere la mia soluzione per non aiutare qualcuno a cercare qualcosa come il metodo BuildUp di StructureMap per Windsor.
Ho scoperto che potrei aggiungere questa funzionalità da solo relativamente facilmente. Ecco un esempio che inietta solo le dipendenze in un oggetto dove trova una proprietà tipizzata all'interfaccia nullo. Si potrebbe estendere il concetto ulteriormente, naturalmente a cercare un particolare attributo, ecc:
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);
}
}
}
}
Ecco un semplice test di unità per questo metodo:
[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
{
}
}
fonte
2011-06-08 09:52:05
Duplicate: http://stackoverflow.com/questions/447193 –
Non è un duplicato di quella domanda. La domanda cui si fa riferimento chiede se il windsor può risolvere oggetti che non sono registrati. – PhilHoy