1

我遇到了控制器无参数构造函数的问题,为了解决它,我将使用 StructureMap

我添加了这个类

public class StructureMapControllerFactory : DefaultControllerFactory
{
    public override IController CreateController(RequestContext requestContext, string controllerName)
    {
        try
        {
            string key = controllerName.ToLowerInvariant();
            return ObjectFactory.GetNamedInstance<IController>(key);
        }
        catch (StructureMapException ex)
        {
            //Use the default logic.
            return base.CreateController(requestContext, controllerName);
        }
    }
}

我补充说

ControllerBuilder.Current.SetControllerFactory(new StructureMapControllerFactory());

到 Global.asax.cs 的 Application_Start()

但我有错误,可能是因为我没有初始化 StructureMap 如何正确初始化它以仅使用 ControllerFactory?

4

1 回答 1

1

您需要在某处注册您的依赖项。有几种方法可以做到这一点,您可以在结构图文档中阅读。

还有一个名为 StructureMap.MVC3 的 NuGet 包,根据项目站点,它可以让所有东西开箱即用。我自己没有测试过。

这是一个带有一个控制器的网站的简单示例

控制器

public class MyController : Controller
{
    private readonly IRepository repository;

    public MyController(IRepository repository)
    {
        this.repository = repository;
    }

    public ActionResult Index()
    {
        ViewBag.Message = repository.GetData();

        return View();
    }
}

全球.asax

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    ObjectFactory.Initialize(a => a.For<IRepository>().Use<Repository>());
    ControllerBuilder.Current.SetControllerFactory(new MyControllerFactory());

    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}

在我的控制器工厂

protected override IController GetControllerInstance(System.Web.Routing.RequestContext requestContext, Type controllerType)
{
    return (Controller)ObjectFactory.GetInstance(controllerType);
}

配置结构图

结构图.MVC3

于 2012-07-27T17:21:58.720 回答