我如何使用structuremap为我提供两种不同方式之一配置的相同具体类型?例如,我有一个类配置为在一个实例中侦听用户队列,但在另一个实例中配置为设施队列。关于对象的其他所有内容都是相同的。
我创建了对象以接受构造函数中的枚举,并且基于枚举值,对象将侦听设施队列或用户队列。那么如何配置structuremap以传递两个不同配置的相同类型的对象?该类实现了我的界面,所以它看起来像这样:
public class Configuration : IConfiguration {
public Configuration(enum configType) {
if (configType == enum.users) {
/* code */
} else if(configType == enum.facilities) {
/* code */
}
}
}
然后,我正在尝试设置父类以接受配置对象两次,一旦为设施配置,并且一旦为用户配置。我该怎么做?我想也许我可以根据两个类的实例名称来做到这一点,但我在文档或其他地方找不到任何可能解释如何执行此操作的内容。这是父类的样子:
public class Parent : IParent {
public Parent(IConfiguration facilityConfig, IConfiguration userConfig) {
}
}
因此,在父类中,我希望“facilityConfig”成为传入enum.facilities的Configuration实例,而“userConfig”对象将是同一Configuration类的实例,但是使用enum.users传入。如果我问的话没有意义,请告诉我。
答案 0 :(得分:4)
此问题的一个解决方案可能是拥有两个单独的配置类,而不是基于enum
值进行切换的配置类。
您可以像这样定义IConfiguration
实现:
public class UsersConfiguration : IConfiguration
{
/* code for user */
}
public class FacilitiesConfiguration : IConfiguration
{
/* code for facilities */
}
然后,在容器配置中,您可以使用Ctor
指定将构造函数参数解析为的类型:
var c = new StructureMap.Container();
c.Configure(x =>
{
x.For<IParent>().Use<Parent>()
.Ctor<IConfiguration>("facilityConfig").Is<FacilitiesConfiguration>()
.Ctor<IConfiguration>("userConfig").Is<UsersConfiguration>();
});
注册后,您可以创建IParent
实例:
var p = c.GetInstance<IParent>();
并注意到容器正确设置了两个依赖项。
<强>更新强>
如果IConfiguration
的不同实现存在问题,那么您可以告诉StructureMap如何实例化Parent
:
var c = new Container(x =>
{
x.For<IParent>().UseSpecial(i => i.ConstructedBy(ConstructParent));
});
ConstructParent()
方法可以这样定义:
private static IParent ConstructParent()
{
return new Parent(
new Configuration(ConfigType.facilities),
new Configuration(ConfigType.users));
}
如果您愿意,可以一次性完成这一切:
var c = new Container(x =>
{
x.For<IParent>().UseSpecial(i => i.ConstructedBy(
_ => new Parent(
new Configuration(ConfigType.facilities),
new Configuration(ConfigType.users))));
});
但是,在这种情况下(“除了这个配置值完全相同”)之外,我更愿意在基类(也许是抽象)类中提取常见定义,并有两个派生词只定义不同的配置值。