варьировать строковый параметр, добавленный в конструктор, с помощью Unity - PullRequest
2 голосов
/ 18 ноября 2011

Моя цель - изменить строковый параметр:

Container
 .RegisterInstance<string>("us", @"\\ad1\accounting$\Xml\qb_us.xml")
 .RegisterInstance<string>("intl", @"\\ad1\accounting$\Xml\qb_intl.xml");

driver = Container.Resolve<LoaderDriver>(args[1]); // "us" or "intl"

Что приводит к:

Resolution of the dependency failed, type = "QuickBooksService.LoaderDriver", name = "intl".
Exception occurred while: while resolving.
Exception is: InvalidOperationException - The type String cannot be constructed. You must configure the container to supply this value.
-----------------------------------------------
At the time of the exception, the container was:

  Resolving QuickBooksService.LoaderDriver,intl
  Resolving parameter "reader" of constructor QuickBooksService.LoaderDriver(QuickBooksService.LoaderInputReader reader, QuickBooksService.ILoader[] loaders)
    Resolving QuickBooksService.LoaderInputReader,(none)
    Resolving parameter "inputFile" of constructor QuickBooksService.LoaderInputReader(System.String inputFile, AccountingBackupWeb.Models.AccountingBackup.Company company, Qu
ickBooksService.eTargets targets)
      Resolving System.String,(none)

Это, очевидно, неправильно, но это единственный способ заставить его работать:

if (args[1] == "us")
    Container
        .RegisterType<LoaderInputReader>(
            new InjectionConstructor(
                @"\\ad1\accounting$\Xml\qb_us.xml",
                new ResolvedParameter<Company>(),
                new ResolvedParameter<eTargets>()
            )
        )
    ;
else if (args[1] == "intl")
    Container
        .RegisterType<LoaderInputReader>(
            new InjectionConstructor(
                @"\\ad1\accounting$\Xml\qb_intl.xml",
                new ResolvedParameter<Company>(),
                new ResolvedParameter<eTargets>()
            )
        )
    ;
else
    throw new Exception("invalid company");

driver = Container.Resolve<LoaderDriver>();

Ответы [ 2 ]

2 голосов
/ 19 ноября 2011

Как-то так должно работать:

container
    .RegisterType<LoaderInputReader>(
        "us",
        new InjectionConstructor(
            @"\\ad1\accounting$\Xml\qb_us.xml",
            new ResolvedParameter<Company>(),
            new ResolvedParameter<eTargets>()));
container
    .RegisterType<LoaderInputReader>(
        "intl",
        new InjectionConstructor(
            @"\\ad1\accounting$\Xml\qb_intl.xml",
            new ResolvedParameter<Company>(),
            new ResolvedParameter<eTargets>()));

Это название каждой регистрации LoaderInputReader. Теперь вы можете решить так:

var us = container.Resolve<LoaderInputReader>("us");
var intl = container.Resolve<LoaderInputReader>("intl");
0 голосов
/ 18 ноября 2011

Возможно, вы могли бы изменить

driver = Container.Resolve<LoaderDriver>(args[1]); // "us" or "intl"

с

driver = Container.Resolve<LoaderDriver>(Container.Resolve<string>(args[1]))

Это использует перегрузку Resolve, которая принимает имя , где в вашем случае имя происходит из вашего аргумента.

...