2011-11-28 8 views
6

Nunca antes había usado Windsor pero he usado otros marcos DI, y tengo un problema bastante extraño en este momento.Castle Windsor 3 con argumento constructor como cadena

que tienen una clase de fábrica que tiene una cadena en su constructor, sin embargo cada vez que tratar de resolver ese objeto consigo una excepción diciendo:

Handler for System.String was not found. 

<Message>Handler for System.String was not found.</Message> 
<StackTrace>at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.TryGetHandlerFromKernel(DependencyModel dependency, CreationContext context) in d:\60b7fa65294e7792\src\Castle.Windsor\MicroKernel\Resolvers\DefaultDependencyResolver.cs:line 403 
at Castle.MicroKernel.Resolvers.DefaultDependencyResolver.ResolveCore(CreationContext context, ComponentModel model, DependencyModel dependency) in d:\60b7fa65294e7792\src\Castle.Windsor\MicroKernel\Resolvers\DefaultDependencyResolver.cs:line 270</StackTrace> 
<Type>Castle.MicroKernel.Handlers.HandlerException</Type> 
</InnerException> 
<Message>Missing dependency. 
Component SomeExampleFactory has a dependency on System.String, which could not be resolved. 
Make sure the dependency is correctly registered in the container as a service, or provided as inline argument.</Message> 

La clase se ve algo como:

public interface IDummyFactory 
{ 
    void DoSomething(); 
} 

public class DummyFactory : IDummyFactory 
{ 
    private string someString; 

    public DummyFactory(string someConstructorArg) 
    { 
     someString = someConstructorArg; 
    } 
} 

con una configuración DI continuación:

var someString = "some constructor arg"; 
_container.Register(Component.For<IDummyFactory>().ImplementedBy<DummyFactory>().DependsOn(someString)); 

estoy asumiendo que está tratando de hacer algo tipo de moldeado o formateo que está causando que explote, pero como el tipo en sí es una cadena, y la variable se pasa en una cadena ... incluso puede ser que esté tratando de mapear el tipo de esa variable en lugar del contenido variable, pero no sé lo suficiente sobre el marco DI y la documentación por esta zona

+0

¿Qué versión de Castle Windsor? –

Respuesta

8

Intente llamar la sobrecarga de DependsOn que toma un IDictionary de pares clave/valor para especificar dependencias:

_container.Register(
    Component.For<IDummyFactory>() 
     .ImplementedBy<DummyFactory>() 
     .DependsOn(new Hashtable 
     { 
      { "someConstructorArg", "some constructor arg" } 
     })); 
10

Estaba buscando una respuesta a esto también y parece que ahora tienen algo un poco más simple que ellos llaman "Dependencias en línea" que se implementa mediante (entre otras formas) la D Método ependency.OnValue()

Aquí está el ejemplo genérico de la documentación:

var twitterApiKey = @"the key goes here"; 

container.Register(
    Component.For<ITwitterCaller>().ImplementedBy<MyTwitterCaller>() 
     .DependsOn(Dependency.OnValue("APIKey", twitterApiKey)) 
    ); 

Se utilizará el valor en twitterApiKey para el parametro que tiene el nombre "apikey" (no entre mayúsculas y minúsculas).

http://docs.castleproject.org/Windsor.Inline-Dependencies.ashx

Parece que esto puede haber entrado partir de la versión 3.1, pero no acabo de descifrar su convención actualización de etiquetado.

Cuestiones relacionadas