0

原則を完全に理解するための基本的な作業単位を作成しようとしています。後でリファクタリングできます。私は単にそれを機能させようとしています。困っています。

私は単純なエンティティコードを持っています:

public class Code
{
    public int Id { get; set; }
    public string Type { get; set; }
    public string Value { get; set; }
    public string Description { get; set; } 
}

1つの単純なメソッドを持つCodeRepositoryがあります。

public class CodeRepository
    {
        public Code GetByCode(string value)
        {
            // Go to DB and find code. Just using a sample.
            var code = new Code();
            code.Type = "Dx";
            code.Value = "20";
            return code;
        }
    }

単純なUnitOfWorkクラスがあります。

public class UnitOfWork
{
    private CodeRepository _codeRepository;
    public CodeRepository CodeRepository
    {
        get
        {
            if (_codeRepository == null)
                _codeRepository = new CodeRepository();
            return _codeRepository;
        }
    }

    public void Commit()
    {

    }

    public void Rollback()
    {

    }
} 

UnitOfWorkを使用してリポジトリを呼び出し、名前でコードを取得したい場合は、次のようにします。

var uow = new UnitOfWork();
var code = uow.CodeRepository.GetByCode("x");

使用するために作成された接続はどこにありますか?次にどこに行けばいいのかわからない。また、ADO.NETを使用する必要があります。

更新 以下の人々の多くは、接続をリポジトリで開く必要があると言っています。たとえば、ビューの値を取得するために3つの別々のリポジトリで3つの異なるGetByメソッドを呼び出す必要がある場合、毎回新しい接続を開きたいですか?または、単一の接続を開くことはできますか?

4

3 に答える 3

0

この場合、GetByCodeメソッド自体で接続を作成できます。データが実際に参照されるまでロードせずに遅延ロードする可能性がありますが、それが要件でない限り、おそらくそれは物事を複雑にしすぎます

ただし、これはメソッドの簡単な答えですGet。変更を永続化することになると、それはすべてメモリ内で行われ、接続はコミットで発生します。

于 2012-12-07T20:57:23.727 に答える
0

使用しているリポジトリは、あなたからのすべてのデータアクセスを抽象化しています。したがって、接続を気にしないUoWクラスでは、リポジトリ(理想的にはコンストラクターに挿入されます)を取得してそれを使用します。一方、リポジトリは、好みのデータアクセス方法を使用してdbへの接続を処理します。それが理にかなっていることを願っています...

于 2012-12-07T20:59:23.933 に答える
0

私は、データベースから実際に接続を取得する最後のポイントで接続を作成、開き、使用し、閉じます。GetByCode

public Code GetByCode(string value)
{
    // Go to DB and find code. Just using a sample.
    // assuming SqlConnection, store the connection-string f.e. in the settings
    string sql = "SELECT Columns FROM dbo.Table Where Value=@Value";
    using(var con = new SqlConmection(connectionString))
    using(var cmd = new SqlCommand(sql, con))
    {
        cmd.Parameters.AddWithValue("@Value", value);
        con.open();
        using(var reader = cmd.ExecuteReader())
        {
            while (reader.Read())
            {
                Code code = new Code();
                // initiliaze it from the reader, f.e.
                code.Id = reader.GetInt32(reader.GetOrdinal("Id"));
            }
        }
    }
}

`

于 2012-12-07T21:01:23.517 に答える