【问题标题】:How to conventionally set the LifeTimeManagement in a UnityContainer?如何按惯例在 UnityContainer 中设置 LifeTimeManagement?
【发布时间】:2014-10-10 10:19:54
【问题描述】:

在我的应用程序中,我在通用实现类SimpleMessenger<T> 中使用了信使接口IMessagePublisher<T>。对于同一类型的T,必须有一个且只有一个SimpleMessenger 实例,必须是ContainerControlledLifetimeManaged,没有可能的例外。

我使用 RegisterTypes 自动完成大部分注册:

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

令我大吃一惊的是,容器似乎设法自动注册了我所有的 SimpleMessenger!虽然出乎意料,但这可能是一个好消息。也就是说,如果我按照惯例将所有 IMessagePublisher 实现的生命周期设置为 ContainerControlledLifetimeManagement

简而言之,我想在我的容器中添加一个“注册策略”,类似于

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

但我不知道该怎么做。我已经使用了UnityContainerExtension,但它似乎只在解决时有用,而不是在注册时有用。有什么方法可以实现吗?

【问题讨论】:

    标签: c# unity-container ioc-container


    【解决方案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);
    

    【讨论】:

    • 我刚回来回答我自己的问题,因为我自己发现了这一点,但是您的 linq 查询比我的要好得多(我在 SimpleMessenger 上进行了测试,而不是 IMessageListener)。另外,+1 000 000 向我学习了实用程序 af Any() 并且您可以使用 typeof(Generic) (我在做 typeof(Generic).GetGenericTypeDefinition()...)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多