好吧,我找到了钩子。
首先,你需要创建一个BuilderStrategy
将查找新的映射:
public class DynamicMappingBuildStrategy: BuilderStrategy
{
public override void PreBuildUp(IBuilderContext context)
{
var policy = context.Policies.Get<IBuildKeyMappingPolicy>(context.BuildKey);
if (policy != null)
{
context.BuildKey = policy.Map(context.BuildKey, context);
}
else
{
var oldMapping = context.BuildKey;
var mappedType = DynamicMapper.GetMapping(oldMapping.Type);
context.BuildKey = new NamedTypeBuildKey(mappedType, null);
var lifetime = context.PersistentPolicies.Get<ILifetimePolicy>(oldMapping, true);
if (lifetime != null)
{
context.PersistentPolicies.Set(lifetime, context.BuildKey);
}
}
}
}
然后,你需要创建一个UnityContainerExtension
将在正确的UnityBuildStage
添加BuilderStrategy
:
public class DynamicMappingBehaviorExtension : UnityContainerExtension
{
protected override void Initialize()
{
this.Context.Strategies.AddNew<DynamicMappingBuildStrategy>(UnityBuildStage.TypeMapping);
}
}
然后您需要配置您的容器以使用新的扩展名:
<containers>
<container>
<extensions>
<add type="MyNamespace.DynamicMappingBehaviorExtension, MyDll" />
</extensions>
....More configuration.....
然后你需要添加你的类型映射没有mapTo:
<type type="IVehicle">
<lifetime type="Hierarchical" />
</type>
你要解决'IMyInterface'直接?或者最终依赖于'IMyInterface'的另一种类型?你能提供一个例子吗? –
我将执行api调用,取回提示,这将帮助我选择“mapTo”类型(实现IMyInterface),并且我希望UnityContainer可以使用新的mapTo类型。一种mapTo运行时工厂。 例如:界面是IVehicle。当我需要解析IVehicle时,我需要计算映射类型。我想执行api调用并返回正确的类型(在本例中可能是Truck或SportsCar)。 –
为什么不直接解决具体类型?例如卡车或SportsCar –