GuF*_*edo 3 .net domain-driven-design entity-framework ef-code-first bounded-contexts
恕我直言,最出色的DDD概念之一是应用程序中单独的上下文的能力.但我对如何将所有东西放在一起工作感到困惑.
首先,我知道有一件事与其他事无关.但我的问题完全在于Infrastructure/ORM部分.
例如,我有一个名为Procedure(医疗程序)的域对象.在注册的上下文中,唯一重要的是代码和名称.但是在程序管理上下文中,我有很多其他领域,比如Price,属于这个特定的上下文.
如何使用EF Code First在具有不同属性的两个具有相同名称(在不同上下文中)的实体?基本上,我想在同一个表中保存所有字段,但在一个上下文中只检索2个字段,在另一个上下文中检索所有字段.我怎么能做到这一点?
以下内容受到具有DDD有界上下文的Shrink EF模型的启发.
领域模型:
namespace SO25454395.Domain.Registration
{
using System;
public class Procedure
{
public int Id { get; set; }
public Guid Code { get; set; }
public string Name { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
.
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; }
}
}
Run Code Online (Sandbox Code Playgroud)
有限的背景:
namespace SO25454395.Infrastructure
{
using System.Data.Entity;
public class RegistrationContext : BaseContext<RegistrationContext>
{
public DbSet<Domain.Registration.Procedure> Prodedures { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
.
namespace SO25454395.Infrastructure
{
using System.Data.Entity;
public class ProcedureManagementContext : BaseContext<ProcedureManagementContext>
{
public DbSet<Domain.ProcedureManagement.Procedure> Procedures { get; set; }
}
}
Run Code Online (Sandbox Code Playgroud)
默认的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")
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
最后,我们需要一个包含用于构建完整模型的所有类的上下文.此上下文用于初始化.
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")
{
}
}
}
Run Code Online (Sandbox Code Playgroud)
测试:
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.
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1797 次 |
| 最近记录: |