在我的解决方案中,我有3个项目:WebAPI,BusinessLayer和DataLayer。
在WebAPI中,我将structuremap配置为使用DefaultRegistry:
run()
WebAPI中的控制器类如下所示:
public class DefaultRegistry : Registry
{
public DefaultRegistry()
{
Scan(
scan => {
scan.TheCallingAssembly();
scan.WithDefaultConventions();
});
For<Business.Interfaces.IBusinessClass>().Use(ctx => new Business.BusinessClass());
For<Data.Interfaces.IDataClass>().Use(ctx => new Data.DataClass());
}
}
在此示例中为_businessClass注入依赖项就像一个魅力。
现在让我们来看看BusinessClass实现:
public class MyController : ApiController
{
private readonly IBusinessClass _businessClass;
public MyController(IBusinessClass businessClass)
{
_businessClass = businessClass;
}
public HttpResponseMessage Get(int id)
{
var success = _businessClass.DoSomething();
return success ? Request.CreateResponse(HttpStatusCode.OK) : Request.CreateErrorResponse(HttpStatusCode.BadRequest, "Error");
}
}
在此示例中,_dataClass的依赖项注入不起作用。构造函数中的dataClass参数为null,因此_dataClass字段未正确初始化。我究竟做错了什么? 我将补充说,BusinessClass是在BusinessLayer项目中定义的,而DataClass是在DataLayer项目中定义的(这两个项目都是类库)。
答案 0 :(得分:2)
问题在于您的注册:
您只扫描调用程序集(这意味着Web API项目)。
您还需要包含其他程序集(您可能需要调整名称):
Scan(
scan => {
scan.TheCallingAssembly();
scan.Assembly("BusinessLayer");
scan.Assembly("DataLayer");
scan.WithDefaultConventions();
});
答案 1 :(得分:2)
在您的默认注册表中,您已经通过调用
注册默认约定scan.WithDefaultConventions();
所以这两个电话是多余的。
For<Business.Interfaces.IBusinessClass>().Use(ctx => new Business.BusinessClass());
For<Data.Interfaces.IDataClass>().Use(ctx => new Data.DataClass());
像Kenneth所说,你可能没有扫描BusinessClass
所在的程序集。
public class DefaultRegistry : Registry
{
public DefaultRegistry()
{
Scan(
scan => {
scan.TheCallingAssembly();
scan.AssemblyContainingType<BusinessClass>();
scan.WithDefaultConventions();
});
}
}
答案 2 :(得分:0)
我已经在StructureMap中使用Singleton解决了这个问题。