"没有为此对象定义无参数构造函数。"使用StructureMap

时间:2016-02-28 17:30:49

标签: c# asp.net dependency-injection nservicebus structuremap

我尝试使用NServiceBus设置StructureMap。 我已经下载了所有软件包,NuGet为我创建了一些文件:

New files by NuGet for StructureMap

以下是这些文件中的代码

IoC.cs:

public static class IoC {
    public static IContainer Initialize() {
        var cont = new Container();
        cont.Configure(x =>
                    {
                        x.Scan(scan =>
                                {
                                    scan.TheCallingAssembly();
                                    scan.WithDefaultConventions();
                                });
                        //x.For<IExample>().Use<Example>();
                    });
        return cont;
    }
}

StructureMap.cs:

[assembly: WebActivator.PreApplicationStartMethod(typeof(MyProjectName.App_Start.StructuremapMvc), "Start")]

namespace MyProjectName.App_Start {
    public static class StructuremapMvc {
        public static void Start() {
            IContainer container = IoC.Initialize();
            DependencyResolver.SetResolver(new StructureMapDependencyResolver(container));
            GlobalConfiguration.Configuration.DependencyResolver = new StructureMapDependencyResolver(container);
        }
    }
}

没有改变任何东西,所以那些文件就是这样创建的。 然后我在我的一个控制器中添加了一个构造函数:

public class ProductsController : Controller
{
    private readonly IBus _bus;

    public ProductsController(IBus bus)
    {
        _bus = bus;
    }

    public ActionResult Index()
    {
        ViewBag.Title = "Product list";

        var message = new ProductMessage();
        _bus.Send(message);

        return View();
    }
}

当我收到错误时

  

没有为此对象定义无参数构造函数。

这很奇怪,因为这一行

scan.WithDefaultConventions();
如果我试图注射IBus,

应排除此问题。

我已尝试过什么:

  • 从StructuremapMvc.cs中删除[assembly:...]并调用 来自Global.asax的StructuremapMvc.Start()。结果相同。
  • 在控制器中添加无参数构造函数,其中包含以下内容 它的身体:

    _bus = _bus = new Container()。GetInstance&lt;中IBus&GT;();

    但是_bus仍然为空,我得到一个与之相关的异常。

请协助。

1 个答案:

答案 0 :(得分:4)

应该为您自己的代码和NServiceBus配置相同的容器。下面的代码显示了StructureMap的这种配置。

BusConfiguration busConfiguration = new BusConfiguration();

//Configure the container and use the same one for MVC and NServiceBus    
Container container = new Container();

busConfiguration.UseContainer<StructureMapBuilder>(c => c.ExistingContainer(container));

More information