Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# StructureMap-NullReferenceException_C#_Dependency Injection_Structuremap - Fatal编程技术网

C# StructureMap-NullReferenceException

C# StructureMap-NullReferenceException,c#,dependency-injection,structuremap,C#,Dependency Injection,Structuremap,我是IoC新手,我正在尝试开始使用StructureMap,但当我尝试获取对象实例时,它抛出了一个NullReferenceException。这是我的初始化代码: ObjectFactory.Initialize(x => { x.ForRequestedType<IRepository<Customer>>().TheDefaultIsConcreteType<EFRepository<Customer>>();

我是IoC新手,我正在尝试开始使用StructureMap,但当我尝试获取对象实例时,它抛出了一个NullReferenceException。这是我的初始化代码:

ObjectFactory.Initialize(x =>
{
    x.ForRequestedType<IRepository<Customer>>().TheDefaultIsConcreteType<EFRepository<Customer>>();             
    x.ForRequestedType<ICustomerManager>().TheDefaultIsConcreteType<CustomerManager>();
});
ObjectFactory.Initialize(x=>
{
x、 ForRequestedType()。默认的ConcreteType();
x、 ForRequestedType()。默认的ConcreteType();
});
ICustomerManager使用插入器并接收一个指令:

public class CustomerManager : ICustomerManager
{
  IRepository<Customer> _repository;
  public CustomerManager(IRepository<Customer> repository)
  {
    _repository = repository;
  }

  public Customer GetCustomerById(int id)
  {
    return _repository
             .With(c => c.PhoneNumbers)
             .FirstOrDefault<Customer>(c => c.Id == id);
  }

  public IEnumerable<Customer> GetCustomersByName(string lastName, string firstName, string middleName)
  {
    return _repository.Query(new CustomerMatchesName(lastName, firstName, middleName));
  }
}
公共类CustomerManager:ICCustomerManager
{
i存储库;
公共CustomerManager(IRepository存储库)
{
_存储库=存储库;
}
公共客户GetCustomerById(内部id)
{
返回存储库
.With(c=>c.phonenumber)
.FirstOrDefault(c=>c.Id==Id);
}
public IEnumerable GetCustomerByName(字符串lastName、字符串firstName、字符串middleName)
{
返回_repository.Query(新CustomerMatchesName(lastName、firstName、middleName));
}
}
然后在我的服务层代码中,这一行抛出异常:

var manager = ObjectFactory.GetInstance<ICustomerManager>();
var-manager=ObjectFactory.GetInstance();

我真的不知道从哪里开始调试这个,因为对一般的概念来说太陌生了。你知道在这样一个简单的场景中会出现什么问题吗?

你很可能会遇到一个异常,StructureMap无法构建一个对象,这会导致一个空引用的级联异常,它吞噬了真正的异常

调试这些场景的最佳解决方案是启用catch all exceptions、Ctrl+Alt+E和mark以捕获所有抛出的异常

下一个工具是StructureMap,它提供了一个实用方法
ObjectFactory.WhatDoIHave()

在我所有的项目中,我在应用程序启动(我只做asp.net)的初始化代码中都有以下代码块

#if DEBUG
    string path = Server.MapPath("~/myproj.WhatDoIHave.txt");
    string whatDoIHave = ObjectFactory.WhatDoIHave();
    File.WriteAllText(path, whatDoIHave);
#endif
这个输出给了我无数次的帮助。学习阅读此文件将使您能够基本上解决所有注册问题,因为您将能够准确地看到您所做的和没有的


大多数情况下,使用StructureMap,您最终会对您没有的内容进行故障排除。这通常归结为需要注册StructureMap无法满足的复杂类型。

问题最终在于具体对象本身,而不是StructureMap。谢谢你的建议-他们帮助我消除了这个问题。我自己也去过很多次,我相信这种方法每次都能解决我的问题。我相信两三年前我确实在StructureMap中遇到了一个bug,这个bug已经修复了。我们的web应用程序中有一个路径,可以将WhatDoIHave()转储到浏览器中。非常有用。可能是