试图在c#中围绕工作单元模式

时间:2012-12-07 20:53:34

标签: c# unit-of-work

我正在努力创建一个基本的工作单元来充分理解这些原则。我可以稍后再考虑一下。我只是想让它运转起来。我遇到了一些麻烦。

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

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

3 个答案:

答案 0 :(得分:0)

在这种情况下,您可以在GetByCode方法本身中创建连接。您可能会使其延迟加载并在实际引用其数据之前不加载,但这可能会使事情变得复杂,除非这是一项要求

但是,这是Get方法的简单答案。在持久化任何更改时,这些都将在内存中完成,并且连接将在Commit中进行。

答案 1 :(得分:0)

您正在使用的存储库将抽象出您的所有数据访问权限。因此,在UoW类中,您不关心连接,只需获取存储库(理想情况下在构造函数中注入)并使用它。另一方面,存储库将使用您首选的数据访问方法处理与db的连接。希望有意义......

答案 2 :(得分: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"));
            }
        }
    }
}

`