3

LINQ やその他の ORM を使用せずにリポジトリ パターンを使用することは理にかなっていますか? 私は MONO でアプリケーションを作成し、MySQL を使用しています。repositoy パターンを使用することを考えていましたが、IQueryable を処理することはできません。リポジトリ呼び出しでデータベース側でフィルタリングが行われることを明確にするために、リポジトリでより多くのメソッドを公開することを考えていました。それがデザインまたは他のデザインアイデアの有効な使用である場合、何か提案はありますか?

4

3 に答える 3

3

リポジトリは、IQueryable とはまったく関係ありません。あなたが考えているのは、Rob Conory .net 3.5 がレポジトリ パターンを取り入れたもので、実際にはデータ ブローカー パターンに近いものです。

リポジトリはオブジェクトを返す責任があり、データ アクセスを処理するため、アプリケーションの残りの部分はそれを認識しません。

Martin Fowlers のサイトで非常に高度な説明を見ることができます。

于 2009-01-15T13:07:35.080 に答える
0

もちろん。リポジトリは、linq で使用される単純なパターンです。それを介して、必要なあらゆる種類のデータアクセスを提供できます。私が取り組んでいるプロジェクトでは、厳密に型指定された DataSet を扱うリポジトリを使用しています。

于 2009-01-15T13:41:16.883 に答える
0

それは絶対に可能です。ただし、クエリをリポジトリ サイトに移動し、クラスごとに 1 つのリポジトリを実装する必要があります。例えば:

public abstract class GenericRepository : IRepository {
    public virtual T Get<T>(Identity id) where T : PersistentDocument {
        using (IDbConnection connection = GetConnection())
        using(IDbCommand command = CreateGetCommand(id, connection)) {
            using (IDataReader reader = command.ExecuteReader()) {
                var mapper = DaHelper.GetMapper<T>();
                return mapper.Map(reader);
            }
        }
    }

    protected virtual IDbCommand CreateGetCommand(Identity id, IDbConnection connection) {
        IDbCommand command = connection.CreateCommand();
        command.CommandText = String.Format("SELECT * FROM {0} e WHERE e.id = ?", TableName);
        command.Parameters.Add(id.ToGuid());
        return command;
    }

    protected abstract string TableName { get; }
}

public class UserRepository: GenericRepository<User>, IUserRepository
{
    protected override string TableName { get { return "users"; } }

    public User GetByEmail(string email)
    {
        using (IDbConnection connection = GetConnection())
        using (IDbCommand command = connection.CreateCommand())
        {
            command.CommandText  = String.Format("SELECT * FROM {0} e WHERE e.email = ?", TableName);
            command.Parameters.Add(email);
            using (var reader = command.ExecuteReader())
                return DaHelper.GetMapper<T>().Map(reader);
        }
    }
}
于 2009-01-15T13:26:37.383 に答える