Замок Виндзор 3 с аргументом конструктора в виде строки - PullRequest
6 голосов
/ 28 ноября 2011

Я никогда раньше не использовал Windsor, но использовал другие DI-фреймворки, и у меня сейчас довольно странная проблема.

У меня есть фабричный класс, который принимает строку в своем конструкторе, однако всякий раз, когда я пытаюсь разрешить этот объект, я получаю исключение:

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>

Класс выглядит примерно так:

public interface IDummyFactory
{
    void DoSomething();
}

public class DummyFactory : IDummyFactory
{
    private string someString;

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

С настройкой DI ниже:

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

Я предполагаю, что он пытается выполнить какое-то приведение или форматирование, которое вызывает его бомбардировку, но поскольку сам тип является строкой, а переменная передается в строке ... это может быть даже на тот случай, если он пытается отобразить тип этой переменной, а не ее содержимое, но я недостаточно знаю структуру DI и документацию по этой области

Ответы [ 2 ]

10 голосов
/ 30 января 2013

Я тоже искал ответ на этот вопрос, и похоже, что теперь у них есть нечто немного более простое, которое они называют «встроенными зависимостями», которое реализуется (среди прочих способов) методом Dependency.OnValue ().

Вот общий пример из документации:

var twitterApiKey = @"the key goes here";

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

Он будет использовать значение в twitterApiKey для параметра с именем «APIKey» (без учета регистра).

https://github.com/castleproject/Windsor/blob/master/docs/inline-dependencies.md

Похоже, что это, возможно, вошло в версию 3.1, но я не могу полностью расшифровать их соглашение об обновлении тегов.

8 голосов
/ 28 ноября 2011

Попробуйте вызвать перегрузку DependsOn, которая принимает IDictionary пар ключ / значение для указания зависимостей:

_container.Register(
    Component.For<IDummyFactory>()
        .ImplementedBy<DummyFactory>()
        .DependsOn(new Hashtable 
        { 
            { "someConstructorArg", "some constructor arg" }
        }));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...