8

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

4

2 回答 2

13

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

Unity 2.0 的 Beta1 于 2 月 10 日在 Codeplex 上可用。查看发行说明并在此处下载;http://unity.codeplex.com/wikipage?title=Unity2%20Beta1

更新:

于 2010 年 2 月 27 日下载并测试了 Unity 2.0 beta 1,到目前为止它已经准备好生产了。如果您今天使用 Unity 1.2,您将不得不做一些主要工作才能让 Unity 2.0 正常工作,因为 IUnityContainer 接口不完整(?)。因此,如果您想让 IsRegistered 方法在今天工作,您可以创建一个这样的扩展方法:

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

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

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

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

于 2010-02-27T14:44:48.593 回答
2

您唯一的其他选择(当前)是使用ResolveAll<T>()和枚举结果。

于 2009-01-25T02:04:32.750 回答