构造函数中的NullReferenceException,用于解析与Windows IOC for Windows Azure云服务的依赖关系

时间:2013-03-19 23:40:09

标签: azure unity-container ioc-container azureservicebus

我有一个具有Web和辅助角色的Windows Azure云服务。两个角色都使用组合根中的Unity容器来注册类型(截至本文的最新nuget pkgs)。

在调试时在Azure模拟器中运行时,所有这些代码都运行良好,但是,当我创建一个包并部署云服务时,我在角色运行时立即遇到此错误(Web角色将在此时遇到此错误我点击了一个取决于所讨论类型的页面,而工作者角色会在运行时立即点击它。

我收到NullReferenceException,如下所示:

[ResolutionFailedException: Resolution of the dependency failed, type = "MyApp.Mvc.Controllers.HomeController", name = "(none)".
Exception occurred while: Calling constructor MyApp.Azure.Messaging.ServiceBusMessagingClient(System.String serviceBusConnectionString).
Exception is: NullReferenceException - Object reference not set to an instance of an object.

以下是我的类型的ctor中的代码,它是Azure Service Bus的包装客户端:

public ServiceBusMessagingClient(string serviceBusConnectionString)
    {
        Guard.NotNullOrEmpty(() => serviceBusConnectionString, serviceBusConnectionString);

        _log = LogFactory.GetCurrentClassLogger();

        ConnectionString = serviceBusConnectionString;

        _msgFactory = MessagingFactory.CreateFromConnectionString(ConnectionString);
        _retryPolicy = new RetryPolicy<ServiceBusTransientErrorDetectionStrategy>(RetryStrategy.DefaultClientRetryCount);
        _clients = new Dictionary<string, QueueClient>();
    }

这是我的bootstrapper的代码,在web app_start或worker角色的OnStart中调用:

var sbConn = CloudConfigurationManager.GetSetting(Constants.KeyServiceBusConnectionString);
container.RegisterType<IMessagingClient, ServiceBusMessagingClient>(new InjectionConstructor(sbConn));

任何人都可以告诉我为什么我会得到这样的例外吗?我无法在ctor代码中看到任何可能产生空引用的内容。我不明白为什么它在模拟器中工作但在云部署中不起作用。我已经验证了云设置,以确保我的连接字符串存在。谢谢!

1 个答案:

答案 0 :(得分:1)

好的......在创建System.Reflection.StackFrame时,我发现从DEBUB到RELEASE的一些模糊行为更改。

我的LogFactory.GetCurrentClassLogger()方法执行以下代码:

StackFrame frame = new StackFrame(1, false);

显然,在RELEASE构建中,向上移动堆栈将为frame.GetMethod().DeclaringType产生一个空值。

所以解决方案是检查null并使用静态字符串作为记录器名称,如果为null。每天学习一些东西希望这有助于某人。

相关问题