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

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

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

如果配置条目通常如下所示(我已为所有类型创建别名):

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

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

现在,我尝试通过创建一个 UnityContainerExtension 和一个 BuilderStrategy 来做到这一点,事情变得困惑并且部分工作。

因为我只想覆盖 mapTo 部分,所以我想也许我已经走得太远了。

那么,我怎样才能实现这种功能呢?
无论如何我可以覆盖mapTo的getter\strategy吗?

最佳答案

好的,我找到了钩子(Hook)。

首先,您需要创建一个 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>

关于c# - 使用 UnityContainer 进行动态 IOC 映射 - 如何实现?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44670807/

相关文章:

c# - 如何在 IIS Express 中启用外部请求?

java - Guice - Guice 中的 Spring Autowired 相当于什么

c# - 具有 Unity 和单元测试架构设计的 MVVM

c# - 正在解析的属性构造函数中的 Unity Inject 参数

c# - 如何将俄语字符串转换为西里尔字母?

c# - 如何使用双? .NET 中带有 Math.Round 的可空类型

c# - 理解 IoC 与依赖注入(inject)时遇到的问题

c# - 返回抽象泛型类型的适当具体类型

c# - mvc5 : Cannot access a disposed object. asp.net mvc5 使用统一

c# - HttpListener 与 HttpHandler 的困境