测试是否已在Unity中注册了Type

joh*_*hnc 7 inversion-of-control unity-container

我是否可以测试类型是否已在Unity容器中注册而不调用Resolve并捕获异常?

Kje*_*sen 12

Unity 2.0将有一个IsRegistered方法,您可以使用该方法来确定是否已在容器中注册了类型.

截至2月10日,Unity 2.0的Beta1可在Codeplex上使用.请参阅发行说明并在此处下载; http://unity.codeplex.com/wikipage?title=Unity2%20Beta1

更新:

在2010年2月27日下载并测试了Unity 2.0 beta 1,它已经准备好了.如果您今天使用的是Unity 1.2,那么由于不完整的(?)IUnityContainer接口,您将不得不做一些主要的工作来使Unity 2.0正常工作.因此,如果您希望IsRegistered方法今天正常工作,您可以制作如下的扩展方法:

public static class UnityContainerExtensions
{
    public static bool IsRegistered<T>(this IUnityContainer container)
    {
        try
        {
            container.Resolve<T>();
            return true;
        }
        catch
        {
            return false;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,我不是ResolveAll在这里使用.原因是ResolveAll不会返回Unity文档中所述的默认(未命名)注册:

如果您已注册具有相同类型但名称不同的多个类型,则此方法很有用.

请注意,此方法不会返回默认(未命名)注册的实例.