web-dev-qa-db-ja.com

Classic ADO.NetでASP.Net MVCを使用する

ASP.Net MVCを初めて使用するため、その方法を知らないので、クラシックADO.Netを使用してストアドプロシージャにアクセスする方法を探しています。

ほとんどの例は、ADO.Net Entityフレームワークを使用したCRUD操作を示しています。

28
Sandhurst

あなたはリポジトリを持つことができます:

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、EF、その他のORMを使用しているか、外部Webサービス、XMLを呼び出しているか、という名前を付けます。

あとは、お気に入りのDIフレームワークを構成して、リポジトリーの適切な実装をコントローラーに注入するだけです。明日、データアクセステクノロジを変更することに決めた場合、問題はありません。単にIUsersRepositoryインターフェイスの異なる実装を記述し、それを使用するようにDIフレームワークを再構成します。コントローラのロジックに触れる必要はありません。

MVCアプリケーションは、データの保存方法に依存しなくなりました。これにより、特定のデータソースに密接に結合されなくなったコントローラーを単体で単体テストすることも容易になります。

50
Darin Dimitrov

Dapper-dot-net をチェックしてください-純粋なADO.NETに基づいた優れた軽量で、ストアドプロシージャを非常にうまくサポートしています-それについて十分なことを言うことができません!

11
marc_s

ASP.NET MVCは、使用する任意のデータベースフレームワークで動作します。任意の方法(クラシックADO.NETなど)でデータを取得し、結果のデータモデルをビューに渡すことができます。ビューに渡すモデルに一致するモデルのタイプを指定するだけです。

3
Daniel Young

ADO.NETでそれを行う方法を知っている場合は、ASP.NET MVCでそれを行うことができます(これは、完全に異なるフレームワークが互いに依存関係を持たないことに注意してください)。

DataAccessコードをRepostitoriesにカプセル化し、これらのリポジトリをコントローラーで使用できます。

2