【问题标题】:How to use Autofac in seperate areas in mvc3?如何在 mvc3 的不同区域使用 Autofac?
【发布时间】:2014-12-05 01:20:54
【问题描述】:

我现在正在研究有关电子商务的源代码。在这个源码中,brnmall.web是web项目,它的管理平台在库brnmall.web.storeadmin中,在web项目中注册为area。

以下是 brnmall.web:

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

我想在 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' 的控制器时发生错误。确保控制器具有无参数的公共构造函数。”

有人有同样的情况吗?

【问题讨论】:

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


    【解决方案1】:

    BrnMall.Web.StoreAdmin 是单独的 Web 应用程序项目还是 BrnMall.Web 引用的组装项目?

    如果 StoreAdmin 只是 BrnMall.Web 引用的一个程序集,而不是一个可运行的 Web 应用程序,那么我相信您可以删除 StoreAdmin 项目中的单独注册和 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 模块并引用它们的好处是,您可以在每个项目中指定仅属于该程序集的注册,从而使代码更整洁,所有注册也更整洁。

    我希望这会有所帮助?

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-07-29
      • 1970-01-01
      • 2011-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多