StructureMap在多层解决方案中

时间:2015-06-25 12:32:43

标签: c# asp.net-web-api structuremap

在我的解决方案中,我有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项目中定义的(这两个项目都是类库)。

3 个答案:

答案 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解决了这个问题。