2011-07-14 80 views
27

我正在尋找一種方法來訪問存儲過程使用傳統的ADO.Net,因爲我是新的ASP.Net MVC我不知道該怎麼去做。使用ASP.Net MVC與經典ADO.Net

大多數示例顯示使用ADO.Net實體框架的CRUD操作。

+1

只是將這兩篇文章連在一起。 http://stackoverflow.com/questions/2243898/displaying-standard-datatables-in-mvc – yedevtxt

回答

49

你可以有一個存儲庫:

public interface IUsersRepository 
{ 
    public User GetUser(int id); 
} 

然後實現它:

public class UsersRepository: IUsersRepository 
{ 
    private readonly string _connectionString; 
    public UsersRepository(string connectionString) 
    { 
     _connectionString = connectionString; 
    } 

    public User GetUser(int id) 
    { 
     // Here you are free to do whatever data access code you like 
     // You can invoke direct SQL queries, stored procedures, whatever 

     using (var conn = new SqlConnection(_connectionString)) 
     using (var cmd = conn.CreateCommand()) 
     { 
      conn.Open(); 
      cmd.CommandText = "SELECT id, name FROM users WHERE id = @id"; 
      cmd.Parameters.AddWithValue("@id", id); 
      using (var reader = cmd.ExecuteReader()) 
      { 
       if (!reader.Read()) 
       { 
        return null; 
       } 
       return new User 
       { 
        Id = reader.GetInt32(reader.GetOrdinal("id")), 
        Name = reader.GetString(reader.GetOrdinal("name")), 
       } 
      } 
     } 
    } 
} 

,然後你的控制器可以使用這個倉庫:

public class UsersController: Controller 
{ 
    private readonly IUsersRepository _repository; 
    public UsersController(IUsersRepository repository) 
    { 
     _repository = repository; 
    } 

    public ActionResult Index(int id) 
    { 
     var model = _repository.GetUser(id); 
     return View(model); 
    } 
} 

這樣的控制器不更長時間取決於數據訪問層的實現:是否使用純ADO.NET,NHibernate,E F,一些其他的ORM,調用一個外部的Web服務,XML,你的名字。

現在剩下的就是配置您最喜歡的DI框架,以便將正確的存儲庫實現注入到控制器中。如果明天你決定改變你的數據訪問技術,沒問題,只需編寫一個不同的IUsersRepository接口實現,並重新配置你的DI框架來使用它。無需觸摸您的控制器邏輯。

您的MVC應用程序不再與數據的存儲方式相關聯。由於它們不再與特定的數據源緊密耦合,因此它可以更容易地單獨測試控制器。

+5

非常好的方法 - 將它與Dapper結合起來,你可以爲自己節省另一個無聊的,令人難以置信的左右分配代碼... –

+1

@marc_s,是的,從我的實驗來看,Dapper看起來像一個偉大的光 - 體重ORM。我已經在考慮我的下一個項目。我有點厭倦了NHibernate。 –

+0

非常非常好的解釋。我非常欣賞將Repository設計模式和純Ado.net風格相結合的方式。謝謝@達林。 –

9

退房Dapper-dot-net - 這是推動這個網站 - 優秀,輕量,基於純ADO.NET,支持存儲過程非常好 - 不能說很多好東西!

2

ASP.NET MVC適用於您要使用的任何數據庫框架。您可以以任何您喜歡的方式(例如傳統的ADO.NET)檢索數據,並將生成的數據模型傳遞給視圖。您只需在視圖中指定模型的類型以匹配您傳遞給它的對象。

1

如果你知道如何使用ADO.NET,你可以在ASP.NET MVC中做到這一點(注意,這是完全不同的框架彼此沒有依賴關係)。

您可以將DataAccess代碼封裝到Repostitories中,並在控制器中使用這些存儲庫;

+0

你能否給我任何參考鏈接。 @alexanderb –