0

我正在尝试创建一个基本的工作单元来充分理解这些原则。我可以稍后重新考虑。我只是想让它工作。我遇到了一些麻烦。

我有一个简单的实体代码:

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 方法来获取视图的值,我是否想每次都打开一个新连接?或者,我可以打开一个连接吗?

4

3 回答 3

0

在这种情况下,您可以在GetByCode方法本身中创建连接。您可能会使其延迟加载并且在实际引用其数据之前不加载,但这可能会使事情复杂化,除非它是必需的

但是,这是一种Get方法的简单答案。当涉及到持久化任何更改时,这一切都将在内存中完成,并且连接将发生在 Commit 中。

于 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 回答