gpt4 book ai didi

.net - 工作单元实现

转载 作者:行者123 更新时间:2023-12-04 18:15:07 26 4
gpt4 key购买 nike

我已经能够实现一个很酷的工作单元来使用 Entity Framework 。

我想出了..

public class UnitOfWork : IUnitOfWork
{
private Database _database;
private IDatabaseFactory _databaseFactory;

private DbTransaction transaction;

public UnitOfWork(IDatabaseFactory databaseFactory)
{
_databaseFactory = databaseFactory;
_database = Database;

transaction = _database.Database.Connection.BeginTransaction();
}

public Database Database
{
get { return _database ?? (_database = _databaseFactory.Get()); }
}

public void Dispose()
{
try
{
_database.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
}
}
}

我很确定现在每个人都嫉妒这个工作单元。 (开玩笑)

但是我在这个服务层有一点设计问题。
public class JournalService : IJournalService
{
IJournalRepository _journalRepository;

public JournalService(IJournalRepository journalRepository)
{
_journalRepository = journalRepository;
}

public void AjouterJournal(Journal j)
{
[B]using (IUnitOfWork uow = new UnitOfWork())[/B]
{
var journal = new Journal();
journalRepository.AddJournal(journal);

}
}
}

问题是工作单元需要数据库注入(inject),所以我无法创建它的实例。我不能直接在服务层中提供工作单元,因为这没有任何意义,因为工作单元需要是一次性的。

而且因为我使用存储库来添加我的东西,所以不需要直接访问工作单元,无论如何都会在处理它时自动进行保存。

我可以在我的服务层中注入(inject) IDatabaseFactory,但我的想法是不要在那里使用它。实际上服务层不应该知道它。

UnitOfWork 工厂怎么样?

关于如何解决这个问题的任何想法或建议?

谢谢。

最佳答案

如果你想使用你当前的架构,你应该将 UnitOfWork 注入(inject)到服务中。您的服务不会对 UnitOfWork 实现产生内部(隐藏)依赖,并且它的可测试性会更好。它与面向对象体系结构的许多原则密切相关。

另一件事是此实现仅可用于简单的 CRUD 操作。在更复杂的服务中,您最终会得到多个操作的组合(可能来自多个服务),每个操作都将使用 UnitOfWork 进行操作。在一项业务操作中调用多个 SaveChanges(和事务)可能不是您通常想要的 - 在这种情况下,您只想从某个顶级服务或服务的调用者调用 SaveChanges 一次。典型的场景是单个业务操作有一个工作单元和一个事务,但是您可以在此业务操作中执行很多服务操作。

另一个含义是构建您的存储库。他们可能需要访问数据库,不是吗?因此,您可能已经将 UoW 注入(inject)到存储库构造函数中。如果你这样做,你可以完全避免 UoW 和基本服务之间的关系。

关于.net - 工作单元实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4907857/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com