结构图中的构造函数参数注入用于运行时输入

问题描述 投票:0回答:1

我使用以下代码来初始化我的 SM 容器。下面的代码工作正常。但现在我有一个要求,需要在创建 CultureInfo 实例时传递不同的区域性名称。简而言之,我想在运行时将一些输入传递给 GetCultureName() 方法。这是 SM 的有效使用吗?还是我应该在我的代码中使用适当的文化名称直接实例化 CultureInfo。

    public static IContainer Initialize()
    {
        ObjectFactory.Initialize(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.WithDefaultConventions();
                                });

                        x.For<ICultureInfoProvider>()
                          .Use<DummyCultureInfoProvider>();

                        x.For<IDocumentService>().Use<DummyDocumentService>()
                          .Ctor<CultureInfo>("cultureInfo")
                          .Is(i => new CultureInfo(i.GetInstance<ICultureInfoProvider>().GetCultureName()));
                    });
        return ObjectFactory.Container;
    }
.net ioc-container structuremap
1个回答
0
投票

老问题,但万一这可能对某人有帮助...如果您手头有一个

IContainer
实例,并且您的构造函数具有可能变化且需要在运行时提供的参数,则可以使用
ExplicitArguments
实例。

例如:

IContainer _Container;

public IDocumentService GetService(ICultureInfoProvider provider)
{
    var args = new ExplicitArguments()
        .Set<ICultureInfoProvider>(provider);

    return _Container
        .GetInstance<IDocumentService>(args);
}

这假设构造函数参数可以通过其类型唯一标识。 如果您有多个相同类型的参数,您可以通过名称指定参数,例如:

IContainer _Container;

public IDocumentService GetService(ICultureInfoProvider provider)
{
    var args = new ExplicitArguments()
        .SetArg("cultureInfo", provider);

    return _Container
        .GetInstance<IDocumentService>(args);
}
© www.soinside.com 2019 - 2024. All rights reserved.