MVC 5 NHibernate Autofac,无法查看数据库数据

时间:2014-03-25 18:04:10

标签: nhibernate asp.net-mvc-5 autofac

我正在构建一个连接到MS SQL 2008数据库的MVC5 Web应用程序,以便用户可以搜索并更改存储在那里的数据。我看过一堆autofac教程和示例,但似乎无法使它们工作。

我假设我的autofac配置是问题,因为当我运行应用程序时它说我的模型为空。我认为这意味着autofac没有连接到数据库。

因此,在我的global.asax.cs文件中,我有以下内容:

protected void Application_Start()
    {
        #region Autofac
        // Register Controllers
        var builder = new ContainerBuilder();
        builder.RegisterControllers(typeof(MvcApplication).Assembly); //all controllers in assembly at once ?            
        builder.RegisterControllers(Assembly.GetExecutingAssembly());
        builder.RegisterFilterProvider();

        // Set the Dependency Resolver
        IContainer container = builder.Build();
        DependencyResolver.SetResolver(new AutofacDependencyResolver(container));

        // Register Model Binders
        builder.RegisterModelBinders(typeof(MvcApplication).Assembly); //all binders in assembly at once ?
        builder.RegisterModelBinderProvider();

        // Register Modules
        builder.RegisterModule<PersistenceModule>();           

        #endregion

        AreaRegistration.RegisterAllAreas();
        FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
        RouteConfig.RegisterRoutes(RouteTable.Routes);
        BundleConfig.RegisterBundles(BundleTable.Bundles);


    }

我有hibernate.cfg.xml个文件

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <configSections>
    <section name="hibernate-configuration" type="NHibernate.Cfg.ConfigurationSectionHandler, NHibernate" />
  </configSections>
  <hibernate-configuration xmlns="urn:nhibernate-configuration-2.2">
    <session-factory>
      <property name="connection.provider">NHibernate.Connection.DriverConnectionProvider</property>
      <property name="connection.driver_class">NHibernate.Driver.SqlClientDriver</property>
      <property name="connection.connection_string">Data Source=DEVSRV\SQLSERVER;Initial Catalog=tipdemo;Persist Security Info=True;User ID=admin;Password=***********</property>
      <property name="dialect">NHibernate.Dialect.MsSql2008Dialect</property>
      <property name="proxyfactory.factory_class">NHibernate.ByteCode.LinFu.ProxyFactoryFactory, NHibernate.ByteCode.LinFu</property>
      <!--<mapping assembly="NHibernateTest"/> -->
    </session-factory>
  </hibernate-configuration>
</configuration>

我的PersistenceModule课程是:

public class PersistenceModule : Autofac.Module
    {
        protected override void Load(ContainerBuilder builder)
        {
            if (builder == null)
                throw new ArgumentException("builder", "builder is null");

            base.Load(builder);
        }


        private ISessionFactory ConfigureDB()
        {
            Configuration cfg = new Configuration().Configure(System.Web.HttpContext.Current.Server.MapPath("~/Config/hibernate.cfg.xml"));
            cfg.AddAssembly(typeof(Domain.General.Project).Assembly);
            return cfg.BuildSessionFactory();
        }
    }

1 个答案:

答案 0 :(得分:2)

在构建完成后,您无法在容器中注册内容。

Application_Start示例中的第11行,您正在构建容器,但在设置DependencyResolver后,您需要使用ContainerBuilder注册更多内容。你不能这样做 - 你必须首先注册所有东西,然后建立容器作为你做的最后一件事。

这就是为什么它永远不会进入你的PersistenceModule - 你已经建立了容器,所以它实际上没有注册。

如果由于某种原因,您需要将注册添加到已构建的容器中,则需要创建全新的ContainerBuilder并调用builder.Update(container)。但是,我强烈建议您重新排序,以便最后构建容器,而不是尽可能使用Update路径。