gpt4 book ai didi

.net - 限界上下文和 EF 代码优先 - 如何将它们放在一起?

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

恕我直言,最出色的 DDD 概念之一是应用程序中分离上下文的能力。但是我对如何将所有内容结合在一起感到困惑。

首先,我知道一件事与另一件事无关。但我的问题正好落在基础设施/ORM 部分。

例如,我有一个名为 的域对象。程序 (医疗程序)。在注册上下文中,唯一重要的是 代码 姓名 .但是在过程管理上下文中,我有很多其他字段,例如 价格 属于这个上下文特定的。

如何使用 EF Code First 拥有两个具有相同名称(在不同上下文中)且具有不同属性的实体?基本上,我想将所有字段保存在同一个表中,但在一个上下文中只检索 2 个字段,而在另一个上下文中检索所有字段。我怎么能做到这一点?

最佳答案

以下灵感来自 Shrink EF Models with DDD Bounded Contexts文章。

域模型:

namespace SO25454395.Domain.Registration
{
using System;

public class Procedure
{
public int Id { get; set; }
public Guid Code { get; set; }
public string Name { get; set; }
}
}

.
namespace SO25454395.Domain.ProcedureManagement
{
using System;

public class Procedure
{
public int Id { get; set; }
public Guid Code { get; set; }
public string Name { get; set; }
public decimal Price { get; set; }
}
}

有界上下文:
namespace SO25454395.Infrastructure
{
using System.Data.Entity;

public class RegistrationContext : BaseContext<RegistrationContext>
{
public DbSet<Domain.Registration.Procedure> Prodedures { get; set; }
}
}

.
namespace SO25454395.Infrastructure
{
using System.Data.Entity;

public class ProcedureManagementContext : BaseContext<ProcedureManagementContext>
{
public DbSet<Domain.ProcedureManagement.Procedure> Procedures { get; set; }
}
}

默认的 Code First 行为是为每个上下文创建一个新数据库,因此我们使用基类禁用它并指定应在所有上下文之间共享的数据库。
namespace SO25454395.Infrastructure
{
using System.Data.Entity;

public class BaseContext<TContext> : DbContext where TContext : DbContext
{
static BaseContext()
{
Database.SetInitializer<TContext>(null);
}

protected BaseContext() : base("Database")
{

}
}
}

最后,我们需要一个包含用于构建完整模型的所有类的上下文。此上下文用于初始化。
namespace SO25454395.Infrastructure
{
using SO25454395.Domain.ProcedureManagement;
using System.Data.Entity;

public class DatabaseContext : DbContext
{
public DbSet<Procedure> Procedures { get; set; }

public DatabaseContext() : base("Database")
{
}
}
}

测试:
namespace SO25454395.Tests
{
using SO25454395.Infrastructure;
using System;
using System.Linq;
using Xunit;

public class BoundedContextTests
{
[Fact]
public void Test()
{
using (var databaseContext = new DatabaseContext())
{
databaseContext.Database.Initialize(true);
}

var code = Guid.NewGuid();
var name = "Name";
var price = 123.45m;

using (var procedureManagementContext = new ProcedureManagementContext())
{
var procedure = new Domain.ProcedureManagement.Procedure { Code = code, Name = name, Price = price };
procedureManagementContext.Procedures.Add(procedure);
procedureManagementContext.SaveChanges();
}

using (var registrationContext = new RegistrationContext())
{
var procedure = registrationContext.Prodedures.Single(p => p.Code == code);
Assert.Equal(name, procedure.Name);
// procedure.Price is not available here.
}
}
}
}

关于.net - 限界上下文和 EF 代码优先 - 如何将它们放在一起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25454395/

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