我使用以下代码来初始化我的 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;
}
老问题,但万一这可能对某人有帮助...如果您手头有一个
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);
}