繁体   English   中英

多层解决方案中的StructureMap

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM