2014-03-25 48 views
0

我正在構建一個連接到MS SQL 2008數據庫的MVC5 web應用程序,以便用戶可以搜索並更改存儲在那裏的數據。我已經看了一大堆autofac教程和示例,但似乎無法使其中的任何一個工作。MVC 5 NHibernate Autofac,無法看到數據庫數據

我假設我的autofac配置是問題,因爲當我運行應用程序它說我的模型爲null。我認爲這意味着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(); 
     } 
    } 
+0

另外,我應該提到,我在我的PersistenceModule類中放置了斷點,但它並沒有進入那裏。 – noobieDev

+0

只是好奇爲什麼人們仍然使用nhibernate進行新的開發,現在Entity Framework已經成熟並且功能全面... – EkoostikMartin

+0

我嘗試過使用EF,但是它非常慢並且變得反應遲鈍。該數據庫有大約60個表和大約3000條記錄。但它也有可能讓我錯誤。 有人告訴我,我應該這樣做,而不是... – noobieDev

回答

2

你可以在製造完成後,不要在容器中註冊東西。

對於Application_Start樣本中的第11行,您正在構建容器,但在設置DependencyResolver之後,您註冊了ContainerBuilder的更多內容。你不能這麼做 - 你必須首先註冊所有東西,然後建立容器作爲你最後一件事。

這就是爲什麼它永遠不會輸入您的PersistenceModule - 您已經構建了容器,因此它實際上並未獲得註冊。

如果由於某種原因需要將註冊添加到已經建好的容器中,則需要創建全新的ContainerBuilder並致電builder.Update(container)。不過,我強烈建議您重新安排容器的最後編制順序,如果可能的話,不要去Update路線。