簡體   English   中英

試圖把頭放在C#中的工作單元模式周圍

[英]Trying to wrap my head around the Unit of Work Pattern in c#

我正在嘗試創建一個基本的工作單元以充分理解這些原理。 我可以稍后重構。 我只是想讓它正常工作。 我有麻煩了

我有一個簡單的實體代碼:

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

我有一個使用簡單方法的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方法來獲取視圖的值,我是否想每次打開一個新連接? 或者,我可以打開一個連接嗎?

在這種情況下,您可以在GetByCode方法本身中創建連接。 您可能會使其延遲加載,直到真正引用其數據后才加載,但這可能會使事情復雜化,除非有必要

但是,這是Get方法的簡單答案。 當要持久保存任何更改時,所有更改都將在內存中完成,並且連接將在Commit中進行。

您正在使用的存儲庫正在抽象您的所有數據訪問。 因此,在UoW類中,您無需關心連接,只需獲取一個存儲庫(最好是注入到構造函數中)並使用它。 另一方面,存儲庫將使用首選的數據訪問方法處理與db的連接。 希望有道理...

我將在您實際上從數據庫中檢索到連接的最后一點上創建,打開,使用和關閉連接,因此在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"));
            }
        }
    }
}

`

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM