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>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?=> ????????????{????????????????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>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)!