WebApi多數據庫切換

用抽象工廠來解決多數據庫之間的切換問題是廣泛的,像如下幾篇文章都講的很具體html

申明以前寫的存在強大漏洞 -- 以前有涉及到IoC Autofac的知識點,鄙人孤陋寡聞,在親身實踐後才發現其中奧妙可參照一下幾篇文章web

http://www.codeproject.com/Articles/808894/IoC-in-ASP-NET-MVC-using-Autofac數據庫

http://code.google.com/p/autofac/wiki/Mvc3Integration api

http://www.cnblogs.com/zhouruifu/archive/2012/04/03/dependency-injection-in-asp-net-web-api-using-autofac.html服務器

http://blog.csdn.net/zouyujie1127/article/details/15341569ui

http://www.cnblogs.com/tiger8000/archive/2012/01/04/2312134.htmlthis

可是考慮到在服務器上資源釋放的問題,仍是會選擇採用另外一種實現方式google

先新建一個類庫 Interface,這個類庫對誰都不依賴,這裏有各類抽象的方法,但並無關於數據庫鏈接啊或者操做之類的抽象方法,這裏定義的抽象方法和controller裏的對應,spa

   1:  namespace WebApi.Interface
   2:  {
   3:      public interface ICommon
   4:      {
   5:          int regist(String LoginName, String Password);
   6:      }
   7:  }

再定義一個具體的實現的類庫.net

   1:  namespace WebApi.OracleImp
   2:  {
   3:      public class Common: WebApi.Interface.ICommon
   4:      {
   5:          public int regist(String LoginName, String Password)
   6:          {
   7:              using (var conn = new System.Data.OracleClient.OracleConnection(OracleHelper.ConnString))
   8:              {
   9:                  conn.Open();
  10:                  using (var command = conn.CreateCommand())
  11:                  {
  12:                      command.Parameters.Clear();
  13:                      command.Parameters.Add(new System.Data.OracleClient.OracleParameter(":LoginName", LoginName));
  14:                      command.Parameters.Add(new System.Data.OracleClient.OracleParameter(":Password", Password));
  15:                      command.CommandText = "insert into  YG(DLM,MM) value(:LoginName,:Password)";
  16:                    var result = command.ExecuteNonQuery;
  17:                   return result;
  18:                  }
  19:               }
  20:          }
  21:      }
  22:  }
  最後在Controller裏實現一個或多個接口就能夠了
   1:          Interface.ICommon _common;
   2:          public DemoController(Interface.ICommon common)
   3:          {
   4:              this._common = common;
   5:          }
   6:          [HttpPost]
   7:          public int regist(String LoginName, String Password)
   8:          {
   9:   
  10:              if (String.IsNullOrWhiteSpace(Password))
  11:              {
  12:                 throw new exception("password爲空");
  13:              }
  14:              if (String.IsNullOrWhiteSpace(LoginName))
  15:              {
  16:                 throw new exception("(LoginName))爲空");
  17:              }
  18:   
  19:              var result = _common.regist(LoginName, Password);
  20:              return result;
  21:          }

針對不一樣的數據庫寫不一樣的實現的類庫,就能作到多數據庫的切換了,還的記得子啊webconfig中申明是對哪一個實現的實現

<add key="LoadAssembly" value="WebApi.OracleImp"/>,這樣切換不一樣的實現時就能夠實現對裏面不一樣實現方法的實現。

這裏要實現各依賴項的加載還必需要作到一下幾步:

1.先添加引用

using Autofac;
using Autofac.Integration.WebApi;

2.

var builder = new ContainerBuilder();
builder.RegisterAssemblyTypes(Assembly.Load(ConfigurationSettings.AppSettings["LoadAssembly"]))
.Where(t => true)
.AsImplementedInterfaces();
builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
var container = builder.Build();
GlobalConfiguration.Configuration.DependencyResolver = new AutofacWebApiDependencyResolver(container);

至於爲何須要好好研究會

相關文章
相關標籤/搜索