使用 UnityContainer 进行动态 IOC 映射 - 我该如何实现?
Dynamic IOC mapping with UnityContainer - How can I achieve?
我正在尝试使用我的 UnityContainer
创建智能 IOC 解析器,它将在解析过程中从第三方服务接收信息。
如果配置条目通常如下所示(我为所有类型创建了别名):
<type type="IMyInterface" mapTo="MyInstance">
<lifetime type="Hierarchical" />
</type>
我想删除 mapTo,并在运行时提供它(根据每个相关的解析请求)。
现在,我尝试通过创建一个 UnityContainerExtension
和一个 BuilderStrategy
来做到这一点,但事情变得一团糟,部分工作。
因为我只想重写 mapTo 部分,我想我可能走得太远了。
那么,我怎样才能实现那种功能呢?
无论如何我可以覆盖 mapTo 的 getter\strategy?
好的,所以我找到了钩子。
首先您需要创建一个 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>
我正在尝试使用我的 UnityContainer
创建智能 IOC 解析器,它将在解析过程中从第三方服务接收信息。
如果配置条目通常如下所示(我为所有类型创建了别名):
<type type="IMyInterface" mapTo="MyInstance">
<lifetime type="Hierarchical" />
</type>
我想删除 mapTo,并在运行时提供它(根据每个相关的解析请求)。
现在,我尝试通过创建一个 UnityContainerExtension
和一个 BuilderStrategy
来做到这一点,但事情变得一团糟,部分工作。
因为我只想重写 mapTo 部分,我想我可能走得太远了。
那么,我怎样才能实现那种功能呢?
无论如何我可以覆盖 mapTo 的 getter\strategy?
好的,所以我找到了钩子。
首先您需要创建一个 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>