【问题标题】:vary a constructor injected string parameter with Unity使用 Unity 改变构造函数注入的字符串参数
【发布时间】:2011-11-19 04:43:28
【问题描述】:

我的目标是改变一个字符串参数:

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>();

【问题讨论】:

    标签: c# dependency-injection unity-container


    【解决方案1】:

    这样的事情应该可以工作:

    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");
    

    【讨论】:

    • 你可以稍微简化一下,说: container.RegisterType("us", new InjectionConstructor(string, typeof(Company), typeof(eTargets)); 你只需要显式如果要解析命名依赖项,请使用 ResolvedParameter。
    【解决方案2】:

    也许你可以改变

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

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

    这利用了Resolve overload that takes a name,在您的情况下,名称来自您的论点。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-01-02
      相关资源
      最近更新 更多