我正在使用 Autofac 注册命名实例。我必须将 xml 事务转换为对象。
首先,我有一个枚举。
public enum TransactionType
{
Unknown = 0,
[XmlNode("MyNodeA")]
TypeA = 1,
[XmlNode("MyNodeA")]
TypeB = 2
}
我有一个IDictionary<string, TransactionType>
使用XmlNode
枚举属性创建的方法。
这是我的autofac映射
var mappings = TransactionTypeHelper.GetDictionary();
foreach (var mapping in mappings)
{
builder.Register(ctx => {
return mapping.Key;
})
.Named<TransactionType>(mapping.Value)
.InstancePerLifetimeScope();
}
然后,我有一个TransactionTypeFactory
用于获取TransactionType
基于 xml 节点的方法。
public TransactionType GetTransactionType(string rootNode)
{
return _container.Resolve<TransactionType>(rootNode?.ToLower());
}
我的问题是我想将任何未知的 xml 节点作为未知事务传递,这样我就可以在不更改任何代码的情况下处理新事务。问题是_container.Resolve
如果传入的节点尚未注册,则会引发错误。
如果找不到命名实例而不是抛出错误,我想要做的是让 autofac 返回枚举默认值。有趣的是,我对这个容器进行了单元测试,并且它们都通过了,但是 Autofac 在这个调用上特别失败了。