我正在努力创建一个基本的工作单元来充分理解这些原则。我可以稍后再考虑一下。我只是想让它运转起来。我遇到了一些麻烦。
我有一个简单的实体代码:
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方法来获取视图的值,我是否希望每次都打开一个新连接?或者,我可以打开一个连接吗?
答案 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"));
}
}
}
}
`