【问题标题】:Unity - loadConfiguration, how to resolve only those configuredUnity - loadConfiguration,如何只解析那些配置的
【发布时间】:2013-08-22 00:30:38
【问题描述】:

我想要实现的目标:让 Unity 从配置文件加载映射,然后在源代码中解析从所述配置文件加载的类型

App.Config

<register type="NameSpace.ITill, ExampleTightCoupled" mapTo="NameSpace.Till, NameSpace" />
<register type="NameSpace.IAnalyticLogs, NameSpace" mapTo="NameSpace.AnalyticLogs, NameSpace" />

代码

IUnityContainer container;
container = new UnityContainer();

// Read interface->type mappings from app.config
container.LoadConfiguration();

// Resolve ILogger - this works
ILogger obj = container.Resolve<ILogger>();

// Resolve IBus - this fails
IBus = container.Resolve<IBus>();

问题:有时 IBus 会在 App.config 中定义,有时它不存在。当我尝试解析一个接口/类但它不存在时,我得到一个异常。

有人可以在这里教育我吗?

谢谢, 安德鲁

【问题讨论】:

  • 一起防止出现这种情况。如果IBus 是可选依赖项,则创建并注册Null Object Pattern 实现(实际上是无操作的空实现)。这可以防止您使应用程序逻辑复杂化。

标签: c# dependency-injection unity-container


【解决方案1】:

您使用的是哪个版本的 Unity?在 v2+ 中有一个扩展方法:

public static bool IsRegistered<T>(this IUnityContainer container);

这样你就可以了

if (container.IsRegistered<IBus>())
    IBus = container.Resolve<IBus>();

扩展方法会让这个更好

public static class UnityExtensions
{
    public static T TryResolve<T>(this IUnityContainer container)
    {
        if (container.IsRegistered<T>())
            return container.Resolve<T>();

        return default(T);
    }
}

// TryResolve returns the default type (null in this case) if the type is not configured
IBus = container.TryResolve<IBus>();

另请查看此链接:Is there TryResolve in Unity?

【讨论】:

  • 一个big warning 关于IsRegistered 方法:它仅用于调试,因为它非常慢!它具有 O(n) 的性能特征,可以完全淹没您的应用程序的性能。
  • TryResolve 并不总是返回 null ——它返回类型的默认值(对于引用类型为 null)。但是,如果解析一个 int,例如,将返回 0。此外,与 Unity Resolve 方法保持一致并支持 ResolverOverrides 以及名称覆盖可能会很​​好。
  • 是的,我知道它会返回默认类型,我的意思是它会为 IBus 返回 null。我会更新评论以反映这一点。
猜你喜欢
  • 2014-10-07
  • 2015-06-28
  • 2016-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-05-13
  • 2020-10-19
  • 1970-01-01
相关资源
最近更新 更多