假设我有以下层次结构。
class PersonWithJacket
{
public PersonWithJacket(Jacket jacket)
{
}
}
class Jacket
{
public Jacket(string brand)
{
}
}我在Autofac容器中注册了这些类。
containerBuilder.RegisterType<PersonWithJacket>();
containerBuilder.RegisterType<Jacket>();在运行时,我希望解析一个PersonWithJacket对象,并定义嵌套Jacket类的string brand构造函数参数。我的第一种方法是像这样使用NamedParameter:
var personWithJacket = container.Resolve<PersonWithJacket>(new NamedParameter("brand", "TheBrand"));我将其解读为“解析PersonWithJacket对象,如果遇到名为”TheBrand“的构造函数参数,请使用值'TheBrand'”,但字符串参数无法解析。
是否有方法在运行时定义嵌套对象的构造函数参数的值?
发布于 2014-09-11 01:35:10
这样做的方法似乎是使用容器层次结构。我创建一个基本容器,在其中注册所有公共类型和实例,然后创建注册不同部分的子容器。
var containerBuilder = new ContainerBuilder();
containerBuilder.RegisterType<PersonWithJacket>();
var childContainer1 = new MultitenantContainer(new NullTenantIdStrategy(), containerBuilder.Build());
childContainer1.ConfigureTenant(null, builder => builder.Register(context => new Jacket("Hugo Boss")));
var childContainer2 = new MultitenantContainer(new NullTenantIdStrategy(), containerBuilder.Build());
childContainer2.ConfigureTenant(null, builder => builder.Register(context => new Jacket("H&M")));
var personWithHugoBossJacket = childContainer1.Resolve<PersonWithJacket>();
var personWithHandMJacket = childContainer2.Resolve<PersonWithJacket>();发布于 2014-09-09 00:45:20
哦,算了。对于ResolvedParameter来说,这并没有那么糟糕。
using (var scope = container.BeginLifetimeScope()) {
var someDynamicString = "Brand B";
var personDude = scope.Resolve<PersonWithJacket>(new ResolvedParameter(
(pi, ctx) => pi.ParameterType == typeof(Jacket),
(pi, ctx) => ctx.Resolve<Jacket>(new NamedParameter("name", someDynamicString))));
}https://stackoverflow.com/questions/25734469
复制相似问题