使用UnityContainer进行动态IOC映射 - 如何实现?

时间:2017-06-21 08:33:33

标签: c# inversion-of-control unity-container

我正在尝试使用我的UnityContainer创建智能IOC解析器,该解析器将在解析过程中接收来自第三方服务的信息。

如果配置条目通常看起来像这样(我为所有类型创建了别名):

<type type="IMyInterface" mapTo="MyInstance">
    <lifetime type="Hierarchical" />
</type>

我想删除mapTo,并在运行时提供它(根据每个相关的解析请求)。

现在,我尝试通过创建UnityContainerExtensionBuilderStrategy来做到这一点,事情变得混乱并且部分工作。

由于我只想覆盖mapTo部分,我想也许我已经走了很远。

那么,我该如何实现这种功能呢?
无论如何我可以覆盖mapTo的getter \策略吗?

1 个答案:

答案 0 :(得分:2)

好的,我找到了钩子。

首先,您需要创建一个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,将BuilderStrategy添加到正确的UnityBuildStage中:

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>