2011-11-28 2 views
6

Non ho mai usato Windsor prima ma ho utilizzato altri framework DI e al momento ho un problema piuttosto strano.Castle Windsor 3 con argomento costruttore come stringa

ho una classe fabbrica che prende una stringa nel suo costruttore, tuttavia ogni volta che provo e risolvere tale oggetto ottengo un'eccezione dicendo:

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 classe simile a:

public interface IDummyFactory 
{ 
    void DoSomething(); 
} 

public class DummyFactory : IDummyFactory 
{ 
    private string someString; 

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

Con l'installazione dI seguito:

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

io parto dal presupposto che sta cercando di fare un po ' tipo di casting o formattazione che sta causando il bombardamento, ma poiché il tipo stesso è una stringa e la variabile viene passata in una stringa ... potrebbe anche essere un caso che stia cercando di mappare il tipo di quella variabile piuttosto che il contenuto variabile, ma non so abbastanza sul quadro dI e la documentazione intorno a questa zona

+0

Quale versione di Castle Windsor? –

risposta

8

Prova chiamando il sovraccarico di DependsOn che prende un IDictionary di coppie chiave/valore per specificare le dipendenze:

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

Stavo cercando una risposta anche a questo e sembra che ora abbiano qualcosa di un po 'più semplice che chiamano "Dipendenze Inline" che viene implementata (tra l'altro) dal D metodo ependency.OnValue().

Ecco l'esempio generico dalla documentazione:

var twitterApiKey = @"the key goes here"; 

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

Si utilizzerà il valore in twitterApiKey per il paramter che ha il nome di "apikey" (non tra maiuscole e minuscole).

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

sembra che questo possa essere andato a partire dalla versione 3.1, ma non riesco a decifrare la loro convention aggiornamento tagging.