我知道这个问题很老了,但我想和大家分享一下我在这期间学到的一个解决方案,希望它能帮助有同样问题的人。
使用autofac,您可以注册一个可以使用逻辑解析的函数。
首先,注册每个命名实例。在这个问题中,我使用了一个助手并遍历了一个集合,但本质是将枚举的每个值映射到一个实例。
builder.Register<TransactionAClass>(ctx =>
{
//get any instances required by ConcreteClass from the ctx here and pass into the constructor
return new TransactionAClass();
})
.Named<Interfaces.ITransactionInterface>($"{TransactionType.TypeA:f}")
.InstancePerLifetimeScope();
一旦您拥有了已知值的所有注册,那么我们将注册一个解析器函数。
builder.Register<Func<TransactionType, Interfaces.ITransactionInterface>>(ctx =>
{
//you must resolve the context this way before being able to resolve other types
var context = ctx.Resolve<IComponentContext>();
//get the registered named instance
return (type) =>
{
var concrete = context.ResolveNamed<Interfaces.ITransactionInterface>($"{type:f}");
if (concrete == null)
{
//return a default class or throw an exception if a valid registration is not found
return new TransactionAClass();
}
return concrete;
}
});
然后,您可以像这样使用解析器
public class MyClass
{
private readonly ITransactionInterface transaction;
public MyClass(Func<TransactionType, Interfaces.ITransactionInterface> transactionResolver)
{
transaction = transactionResolver.Invoke(TransactionType.TypeA);
}
}