如何在UnityContainer中常规设置LifeTimeManagement?

时间:2014-10-10 10:19:55

标签: c# unity-container ioc-container

在我的应用中,我在通用实现类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时间。是否有某种方法可以实现这一目标?

1 个答案:

答案 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);