gpt4 book ai didi

c# - TDD 和 DDD 入门

转载 作者:行者123 更新时间:2023-11-30 15:12:16 24 4
gpt4 key购买 nike

我刚刚读完 Eric Evans 的“领域驱动设计:解决软件核心的复杂性”一书,我正在尝试编写我的第一个以领域为中心的应用程序(使用 C#)。

我们的服务台将使用该应用程序来跟踪为用户分配的计算机。

我画了一个简单的类图来反射(reflect)部分领域。看起来像这样……

Class diagram showing two classes: Owner and Computer. There is a one-way associate between Computer and Owner named 'Allocate to' http://www.freeimagehosting.net/uploads/183dd57031.jpg

我还确定了我的第一个功能(为用户分配一台计算机)并为其编写了一个测试...

[Test]
public void AllocateToUser()
{
var user = new Owner("user1");
var computer = new Computer("computer1");

computer.Allocate(user);

Assert.AreEqual(user.Username, computer.AllocatedTo.Username);
}

最后,我编写了使测试通过的代码。

public class Computer
{
public Computer(string name)
{
Name = name;
}

public string Name
{ get; private set; }

public Owner AllocatedTo
{ get; private set; }

public void Allocate(Owner owner)
{
AllocatedTo = owner;
}
}

public class Owner
{
public Owner(string username)
{
Username = username;
}

public string Username
{ get; private set; }
}

到目前为止,一切都很好(我认为)。

但是,显然这些都没有解决持久性问题。我想我需要为计算机引入一个存储库类。也许是这样的:

public class ComputerRepository
{
public void Store(Computer computer)
{
//Some persistence logic here (possibly using NHibernate?)
}
}

现在我卡住了。如何确保将对计算机的分配用户所做的更改传递到存储库?

我似乎有以下选择:

  1. 修改 Computer 类的 Allocate 方法的实现,实例化 ComputerRepositry 的实例并调用 Store 方法。

  2. 创建接口(interface)IComputerRepository;修改 Computer 的构造函数以要求提供实现 IComputerRepository 的类的实例。在 Allocate 方法中,针对这个注入(inject)的实例调用 Store。

  3. 创建一个服务 (AllocationService),它将结束对 Allocate 和 Store 的调用。

  4. 将责任传递给客户端,强制执行调用代码的两个步骤:

    • 在 Computer 类的一个实例上调用 Allocate
    • 实例化 ComputerRepository 的实例并调用 Store。

这些似乎都不令人满意:

  1. 很难测试,因为我会直接在 Computer 类中实例化存储库。

  2. 通过使用依赖注入(inject)避免了这个问题。然而,它仍然很难看,因为每次我想实例化 Computer 时都需要传入 IComputerRepository 的一些实例。

  3. 过于程序化,未能将行为封装在域实体类中。

  4. 看起来很丑。

我应该做什么?

最佳答案

通常我会将行为和持久性视为两个不同的关注点,分别进行测试。

Domain 对象应该对 Repositories 的存在保持无视状态(但显然不是相反)。

我们在这种情况下所做的是创建一个 Controller (或服务),负责从其存储库加载适当的对象,调用对象的行为,然后调用存储库以持久保存更新。

然后您可以使用 Mock 存储库测试 Controller ,以检查 Controller 是否正在使用更新的对象调用存储库。

关于c# - TDD 和 DDD 入门,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1476444/

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