[英]StructureMap in multi-layer solution
在我的解决方案中,我有3个项目:WebAPI,BusinessLayer和DataLayer。
在WebAPI中,我已将structuremap配置为使用DefaultRegistry:
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());
}
}
WebAPI中的控制器类如下所示:
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");
}
}
在此示例中,为_businessClass注入依赖项的工作原理很像。
现在让我们看一下BusinessClass的实现:
public class BusinessClass : IBusinessClass
{
private readonly IDataClass _dataClass;
public BusinessClass(IDataClass dataClass)
{
_dataClass = dataClass;
}
public void DoSomething()
{
_dataClass.DoSomethingWithData();
}
}
在此示例中,_dataClass的依赖项注入无效。 构造函数中的dataClass参数为null,因此_dataClass字段未正确初始化。 我究竟做错了什么? 我将添加BusinessClass是在BusinessLayer项目中定义的,而DataClass是在DataLayer项目中定义的(这两个项目都是类库)。
问题出在您的注册中:
您只扫描调用程序集(这意味着Web API项目)。
您还需要包括其他程序集(您可能需要调整名称):
Scan(
scan => {
scan.TheCallingAssembly();
scan.Assembly("BusinessLayer");
scan.Assembly("DataLayer");
scan.WithDefaultConventions();
});
在您的默认注册表中,您已经在通过调用以下命令来注册默认约定:
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();
});
}
}
我已经通过在StructureMap中使用Singleton解决了该问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.