在我的应用中,我在通用实现类IMessagePublisher<T>
中使用信使接口SimpleMessenger<T>
。对于同一类型T
,必须有一个且只有一个SimpleMessenger
实例必须为ContainerControlledLifetimeManaged
,且无可能例外。
我使用RegisterTypes自动完成大部分注册:
unityContainer.RegisterTypes(
AllClasses.FromAssembliesInBasePath(),
WithMappings.FromAllInterfacesInSameAssembly,
WithName.Default,
WithLifetime.None,
null,
true
);
令我惊讶的是,似乎容器设法自动注册我的所有SimpleMessengers!虽然出乎意料,但这可能是一个好消息。也就是说,如果我设法按常规方式将所有IMessagePublisher实现的生命周期设置为ContainerControlledLifetimeManagement
。
简而言之,我想在我的容器中添加一个“注册策略”,可以说是
if(somehowObtainedTypeToRegister.GetGenericTypeDefinition() == typeof(IMessageListener<object>).GetGenericTypeDefinition())
{
//Set one way or another the ContainerControlledLifetimeManagement for this type
}
但我不知道该怎么做。我已经使用UnityContainerExtension
,但它似乎仅在Reslution时间有用,而不是在Registeration时间。是否有某种方法可以实现这一目标?
答案 0 :(得分:1)
映射它的最简单方法是两次,例如:
首先像以前一样注册所有映射。然后覆盖您希望由ContainerControlledLifetimeManager
处理的所有项目:
unityContainer.RegisterTypes(
AllClasses.FromAssembliesInBasePath()
.Where(t => t.GetInterfaces().Any(
i => i.IsGenericType
&& i.GetGenericTypeDefinition() == typeof(IMessageListener<>))),
WithMappings.FromAllInterfacesInSameAssembly,
WithName.Default,
WithLifetime.ContainerControlled,
null,
true);