【发布时间】:2021-12-30 06:07:48
【问题描述】:
我从 DDD 开始,我有一个疑问。假设这些类(我使用 C# 和 Net Framework 4.7):
public class Address : ValueObject
{
// Properties.
public string Street { get; }
public int Number { get; }
public Address(string street, int number)
{
Street = street;
Number = number;
}
protected override IEnumerable<object> GetEqualityComponents()
{
yield return Street;
yield return Number;
}
}
public class Customer : IAggregateRoot
{
// Properties.
public int Id { get; protected set; }
public string Name { get; protected set; }
public Address Address { get; protected set; }
public Customer(string name, Address address)
{
if (string.IsNullOrEmpty(name)) throw new Exception(nameof(name));
Name = name;
Address = address ?? throw new Exception(nameof(address));
}
// For database purpose.
protected Customer()
{
}
}
我有接口 ICustomerRepository 并且作为基础结构,我需要使用原始 SQL (SQL Server),我的意思是,没有 EF、NHibernate 等。我在存储库实现中使用的方法是定义一个类“CustomerBuilder " 从 Customer 继承,以便能够访问受保护的字段。有没有其他方法可以实现这一目标?因为对于我需要加载的每个实体,我都必须创建一个构建器并重复构造函数和变量映射。
谢谢!
【问题讨论】:
-
为什么不能使用 ORM?这是一个非常严格的要求。
-
@DavidG 我们正在重构我们的应用程序,我们已经使用原始 SQL 查询实现了所有功能。我知道使用 ORM 要容易得多,但我想知道在我们需要继续使用原始 SQL 的情况下会发生什么。
-
什么都不会“发生”,只是要困难得多。我建议使用 Dapper,因为这是 EF 和原始 SQL 之间的一个很好的中间点。它可以让你使用现有的查询并将它们映射到 C# 对象中。
-
@DavidG 我知道这更难,但我真的很想知道如何实现这种情况。我找不到任何没有 ORM 的例子????
-
您可以使用通用包装器来访问非公共属性和方法,但您会失去智能感知,因为您必须使用字段、属性和方法名称。
标签: c# sql-server domain-driven-design