mysql + Fluently NHibernate + WebAPI + Autofac

mysql、fluently nhibernate、webapi、autofac,對我來說每一個都是麻煩疙瘩,現在它們為了一個共同的項目而湊合到一起了。一路磕磕碰碰,現在貌似有了一點眉目。

作為一個步入老人癡呆帕金森階段的老革命,我當然要馬上將奮斗過程記錄下來:

1、MySql + Fluently NHibernate

static?ISessionFactory?sessionFactory;public?static?ISession?OpenSession(string?connString,?string[]?assemblys)  {????if?(sessionFactory?==?null)  ????{  ????????sessionFactory?=?Fluently.Configure()  ????????????.Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.  ????????????????ConnectionString(connString))  ????????????.Mappings(m?=>  ????????????{????????????????foreach?(var?item?in?assemblys)  ????????????????{  ????????????????????m.FluentMappings.AddFromAssembly(Assembly.Load(item));  ????????????????}  ????????????}).BuildSessionFactory();    ????}????return?sessionFactory.OpenSession();  }    OpenSession((connString:?"server=192.168.0.211;?user?id=root;?password=lt1234;?database=pnavrds",?assemblys:?new?string[]?{?"Pnavrds.Data"?});

.NET和NHibernate并不天然支持mysql,所以要在項目添加對mysql.data.dll的引用。mysql.data.dll在mysql的安裝目錄里有。
比如在 C:Program Files (x86)MySQLConnector.NET 6.9Assembliesv4.5

2、WebAPI
有關路由問題。
別看api與MVC很像,但是,MVC支持Area,而api并不。
但是開始時我并不知道。輕車熟路地加了個Area,一訪問,直接404。
路由如下:

public?override?void?RegisterArea(AreaRegistrationContext?context)?  {  ????context.MapRoute(????????"Test_default",????????"Test/{controller}/{id}",????????new?{?id?=?UrlParameter.Optional?}  ????);  }

咋辦呢?難道各種控制器濟濟一堂一鍋粥?后來網上查了資料,添加了一個路由,改為:

public?override?void?RegisterArea(AreaRegistrationContext?context)?  {  ????context.Routes.MapHttpRoute(????????"Test_defaultAPI",????????"api/Test/{controller}/{id}",????????new?{?id?=?RouteParameter.Optional?}  ????);  ????context.MapRoute(????????"Test_default",????????"Test/{controller}/{action}/{id}",????????new?{?action?=?"Index",?id?=?UrlParameter.Optional?}  ????);  }

注意,這樣處理之后,同一個控制器,就有兩個地址都可以訪問。一個有區域,一個沒有區域:

http://localhost/Pnavrds.API/api/Test/Dev3/10http://localhost/Pnavrds.API/api/Dev3/10

因為asp.net webapi并不支持區域,不管你這個控制器放在哪個文件夾、哪個命名空間下,它都頑強地解釋到根目錄下。我們上面做的努力,僅僅是多了一個含有區域名稱的地址而已。

參考資料

3、Autofac
這個東東是個好東東。我現在都有點離不開它了。不然那么多實例需要構造,然后每個構造函數都N多參數,太麻煩。但是,因為了解不夠,每次用它,好像都要費一些周折,并且很難調試。
這次也不例外。

1)提示System.Web.Http的版本不對。
引用的system.web.http.dll版本為5.2.3.0,但系統說跟5.2.0.0對應不上,編譯時雖然可以通過,但有警告,建議在app.config里寫些啥啥啥。我找遍了代碼,都看不到哪里聲明了5.2.0.0。

后來還是根據編譯器的提示,將它給出的代碼,加到web.config里,編譯警告就沒有了,運行就再無這個錯誤:

<runtime>????  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ??</runtime>

附上編譯信息:

4&gt;C:Program?Files?(x86)MSBuild14.0binMicrosoft.Common.CurrentVersion.targets(1819,5):?warning?MSB3247:?發現同一依賴程序集的不同版本間存在沖突。  在?Visual?Studio?中,請雙擊此警告(或選擇此警告并按?Enter)以修復沖突;否則,請將以下綁定重定向添加到應用程序配置文件中的“runtime”節點:?  <assemblybinding><dependentassembly><assemblyidentity></assemblyidentity><bindingredirect></bindingredirect></dependentassembly></assemblybinding>  ?<assemblybinding><dependentassembly><assemblyidentity></assemblyidentity><bindingredirect></bindingredirect></dependentassembly></assemblybinding>  ?<assemblybinding><dependentassembly><assemblyidentity></assemblyidentity>  ?<bindingredirect></bindingredirect></dependentassembly></assemblybinding>

2)說控制器沒有默認構造函數
這說明autofac沒有正常運行,否則不會報這個錯。構造實例正是autofac的工作。

后來改了autofac的builder內容。代碼如下:

public?class?AutofacConfig  {????public?static?void?BuildContainer()  ????{????????var?builder?=?new?ContainerBuilder();????????//Infrastructure?objects  ????????builder.RegisterApiControllers(typeof(WebApiApplication).Assembly);  ????????builder.RegisterAssemblyTypes(typeof(WebApiApplication).Assembly).AsImplementedInterfaces();    ????????builder.RegisterModule(new?AutofacWebTypesModule());????????//其他代碼.....    ????????builder.RegisterModelBinderProvider();  ????????builder.RegisterFilterProvider();    ????????IContainer?container?=?builder.Build();????????//DependencyResolver.SetResolver(new?AutofacDependencyResolver(container));  ????????GlobalConfiguration.Configuration.DependencyResolver?=?(new?AutofacWebApiDependencyResolver(container));  ????}  }

mysql、fluently nhibernate、webapi、autofac,對我來說每一個都是麻煩疙瘩,現在它們為了一個共同的項目而湊合到一起了。一路磕磕碰碰,現在貌似有了一點眉目。

作為一個步入老人癡呆帕金森階段的老革命,我當然要馬上將奮斗過程記錄下來:

1、MySql + Fluently NHibernate

static?ISessionFactory?sessionFactory;public?static?ISession?OpenSession(string?connString,?string[]?assemblys)  {????if?(sessionFactory?==?null)  ????{  ????????sessionFactory?=?Fluently.Configure()  ????????????.Database(FluentNHibernate.Cfg.Db.MySQLConfiguration.Standard.  ????????????????ConnectionString(connString))  ????????????.Mappings(m?=&gt;  ????????????{????????????????foreach?(var?item?in?assemblys)  ????????????????{  ????????????????????m.FluentMappings.AddFromAssembly(Assembly.Load(item));  ????????????????}  ????????????}).BuildSessionFactory();    ????}????return?sessionFactory.OpenSession();  }    OpenSession((connString:?"server=192.168.0.211;?user?id=root;?password=lt1234;?database=pnavrds",?assemblys:?new?string[]?{?"Pnavrds.Data"?});

.NET和NHibernate并不天然支持mysql,所以要在項目添加對mysql.data.dll的引用。mysql.data.dll在mysql的安裝目錄里有。
比如在 C:Program Files (x86)MySQLConnector.NET 6.9Assembliesv4.5

2、WebAPI
有關路由問題。
別看api與MVC很像,但是,MVC支持Area,而api并不。
但是開始時我并不知道。輕車熟路地加了個Area,一訪問,直接404。
路由如下:

public?override?void?RegisterArea(AreaRegistrationContext?context)?  {  ????context.MapRoute(????????"Test_default",????????"Test/{controller}/{id}",????????new?{?id?=?UrlParameter.Optional?}  ????);  }

咋辦呢?難道各種控制器濟濟一堂一鍋粥?后來網上查了資料,添加了一個路由,改為:

public?override?void?RegisterArea(AreaRegistrationContext?context)?  {  ????context.Routes.MapHttpRoute(????????"Test_defaultAPI",????????"api/Test/{controller}/{id}",????????new?{?id?=?RouteParameter.Optional?}  ????);  ????context.MapRoute(????????"Test_default",????????"Test/{controller}/{action}/{id}",????????new?{?action?=?"Index",?id?=?UrlParameter.Optional?}  ????);  }

注意,這樣處理之后,同一個控制器,就有兩個地址都可以訪問。一個有區域,一個沒有區域:

http://localhost/Pnavrds.API/api/Test/Dev3/10http://localhost/Pnavrds.API/api/Dev3/10

因為asp.net webapi并不支持區域,不管你這個控制器放在哪個文件夾、哪個命名空間下,它都頑強地解釋到根目錄下。我們上面做的努力,僅僅是多了一個含有區域名稱的地址而已。

參考資料

3、Autofac
這個東東是個好東東。我現在都有點離不開它了。不然那么多實例需要構造,然后每個構造函數都N多參數,太麻煩。但是,因為了解不夠,每次用它,好像都要費一些周折,并且很難調試。
這次也不例外。

1)提示System.Web.Http的版本不對。
引用的system.web.http.dll版本為5.2.3.0,但系統說跟5.2.0.0對應不上,編譯時雖然可以通過,但有警告,建議在app.config里寫些啥啥啥。我找遍了代碼,都看不到哪里聲明了5.2.0.0。

后來還是根據編譯器的提示,將它給出的代碼,加到web.config里,編譯警告就沒有了,運行就再無這個錯誤:

<runtime>????  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ????<assemblybinding>  ??????<dependentassembly>  ????????<assemblyidentity></assemblyidentity>  ????????<bindingredirect></bindingredirect>  ??????</dependentassembly>  ????</assemblybinding>  ??</runtime>

附上編譯信息:

4&gt;C:Program?Files?(x86)MSBuild14.0binMicrosoft.Common.CurrentVersion.targets(1819,5):?warning?MSB3247:?發現同一依賴程序集的不同版本間存在沖突。  在?Visual?Studio?中,請雙擊此警告(或選擇此警告并按?Enter)以修復沖突;否則,請將以下綁定重定向添加到應用程序配置文件中的“runtime”節點:?  <assemblybinding><dependentassembly><assemblyidentity publickeytoken="31bf3856ad364e35"></assemblyidentity><bindingredirect></bindingredirect></dependentassembly></assemblybinding><assemblybinding><dependentassembly><assemblyidentity publickeytoken="aa95f207798dfdb4"></assemblyidentity><bindingredirect></bindingredirect></dependentassembly></assemblybinding><assemblybinding><dependentassembly><assemblyidentity></assemblyidentity><bindingredirect></bindingredirect></dependentassembly></assemblybinding>

2)說控制器沒有默認構造函數
這說明autofac沒有正常運行,否則不會報這個錯。構造實例正是autofac的工作。

后來改了autofac的builder內容。代碼如下:

public?class?AutofacConfig  {????public?static?void?BuildContainer()  ????{????????var?builder?=?new?ContainerBuilder();????????//Infrastructure?objects  ????????builder.RegisterApiControllers(typeof(WebApiApplication).Assembly);  ????????builder.RegisterAssemblyTypes(typeof(WebApiApplication).Assembly).AsImplementedInterfaces();    ????????builder.RegisterModule(new?AutofacWebTypesModule());????????//其他代碼.....    ????????builder.RegisterModelBinderProvider();  ????????builder.RegisterFilterProvider();    ????????IContainer?container?=?builder.Build();????????//DependencyResolver.SetResolver(new?AutofacDependencyResolver(container));  ????????GlobalConfiguration.Configuration.DependencyResolver?=?(new?AutofacWebApiDependencyResolver(container));  ????}  }

以上就是mysql + Fluently NHibernate + WebAPI + Autofac的內容,更多相關內容請關注PHP中文網(www.php.cn)!

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享