如何在mvc3的不同区域使用Autofac?

时间:2014-12-05 01:20:55

标签: asp.net-mvc-3 autofac area

我正在研究有关电子商务的源代码。在此源代码中,brnmall.web是Web项目,其管理平台位于库brnmall.web.storeadmin中,该库在web项目中注册为区域。

下面的

是brnmall.web:

enter image description here

下面的

是brnmall.web.storeadmin,在brnmall.web中注册为区域:

enter image description here

我想在brnmall.web.storeadmin中使用autofac,所以我在其中添加了另一个global.asax,在application_start方法中,我注册了我需要的所有控制器和组件。 但是当我使用下面的代码来触发数据时

   public ActionResult Index()
    {
        var serviceTypeRepo = unitOfWork.Repository<BrnMall.DAL.Access.cha_servicetype>();
        var result = serviceTypeRepo.Get(x => x.serviceid == 1);
        ViewBag.result = result;
        return View();
    }

异常抛给我: “尝试创建'BrnMall.Web.Charging.Controllers.HomeController'类型的控制器时发生错误。确保控制器具有无参数的公共构造函数。”

任何人都有相同的情况?

1 个答案:

答案 0 :(得分:0)

BrnMall.Web.StoreAdmin是一个单独的Web应用程序项目还是由BrnMall.Web引用的程序集项目?

如果StoreAdmin只是由BrnMall.Web引用的程序集而不是可自行运行的Web应用程序,那么我相信您可以删除StoreAdmin项目中的Seperate注册和global.asax,但我会将这些注册替换为如下所示的AutofacModule注册类,它将在该程序集中注册所有控制器。

然后将所有内容连接起来,您只需要让BrnMall.Web Autofac注册注册您的新模块,该模块将在该程序集中注册控制器以及您决定在那里注册的任何其他组件。

例如

在您的BrnMall.Web项目中......

public class Global : HttpApplication
{
    private void Application_Start(object sender, EventArgs e)
    {
        var builder = new ContainerBuilder();
        builder.RegisterControllers(Assembly.GetExecutingAssembly()); //Register controllers in the Executing Assembly
        builder.RegisterModule<BrnMall.Web.StoreAdmin.AutofacModule>(); //Register the registrations in the StoreAdmin Autofac Module below.
        //Register any other components

        var container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
    }
}

在您的BrnMall.Web.StoreAdmin ...

using Autofac;

public class AutofacModule : Module
{
    protected override void Load(ContainerBuilder builder)
    {
        builder.RegisterControllers(ThisAssembly); //This will register any Controllers that are in this assembly
        //Register any other components that relate to this particular Project
    }
}

注册Autofac模块并引用它们的好处是,您可以在每个项目中指定仅属于该程序集的注册,这使得代码更加整洁,并且您的所有注册都更加整洁。

我希望这有帮助吗?