2014-10-10 15 views
1

在我的应用程序中,我在通用实现类SimpleMessenger<T>中使用了messenger界面IMessagePublisher<T>。对于相同类型的T,必须有且仅有一个SimpleMessenger实例必须是ContainerControlledLifetimeManaged而没有可能的例外。如何按常规在UnityContainer中设置LifeTimeManagement?

我用RegisterTypes到automaticaly做我的大部分registerations的:

unityContainer.RegisterTypes(
      AllClasses.FromAssembliesInBasePath(), 
      WithMappings.FromAllInterfacesInSameAssembly, 
      WithName.Default, 
      WithLifetime.None, 
      null, 
      true 
      ); 

而且我很大的惊喜,看来容器管理自动注册我的所有SimpleMessengers!虽然出乎意料,但这可能是一个好消息。也就是说,如果我设法将传统上的生命周期设置为ContainerControlledLifetimeManagement来实现我所有的IMessagePublisher实现。

几句话,我想添加到我的容器“Registeration战略”,它会说像

if(somehowObtainedTypeToRegister.GetGenericTypeDefinition() == typeof(IMessageListener<object>).GetGenericTypeDefinition()) 
{ 
    //Set one way or another the ContainerControlledLifetimeManagement for this type 
} 

但我不知道如何做到这一点。我已经使用了UnityContainerExtension,但它似乎只在Reslution时间有用,而不是在注册时间。是否有某种方法可以实现这一目标?

回答

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); 
+1

我刚回来回答我的问题,因为我发现了这一点,对我自己的,但是你的LINQ查询的方式比我好(我在做什么我在SimpleMessenger上代替IMessageListener的测试)。另外,+1 000 000学习我的实用工具af any()和你可以使用typeof(Generic <>)(我正在做typeof(通用).GetGenericTypeDefinition()...) – IronSlug 2014-10-10 12:15:56