C# 我应该如何构造我的域模型
我尝试将我的特定域问题抽象到银行帐户,假设以下情况:C# 我应该如何构造我的域模型,c#,java,architecture,domain-driven-design,domain-model,entity-framework,C#,Java,Architecture,Domain Driven Design,Domain Model,Entity Framework,我尝试将我的特定域问题抽象到银行帐户,假设以下情况: 我有一个特定客户的银行登录名 每个客户可以有多个属于同一登录名的银行帐户 每个银行账户可以有数千笔交易 我将类结构设计为如下(简化): 公共类登录 { 私人银行账户清单; …更多字段、ctor、getter、setter。。。 } 公共类帐户 { 私人清单交易; …更多字段、ctor、getter、setter。。。 } 公共类事务 { 字符串注释; …更多字段、ctor、getter、setter。。。 } 但是如果我有20个帐户,每
- 我有一个特定客户的银行登录名
- 每个客户可以有多个属于同一登录名的银行帐户
- 每个银行账户可以有数千笔交易
公共类登录
{
私人银行账户清单;
…更多字段、ctor、getter、setter。。。
}
公共类帐户
{
私人清单交易;
…更多字段、ctor、getter、setter。。。
}
公共类事务
{
字符串注释;
…更多字段、ctor、getter、setter。。。
}
但是如果我有20个帐户,每个帐户有10000个事务,我从数据库加载整个模型,会有大量内存,即使我不知道客户是否需要所有这些事务
我想建立一个更简化的模型,如下所示:
public class Login
{
private List<SimpleAccount> _bankingAccounts;
....more fields, ctor, getters, setters...
}
public class SimpleAccount
{
....more fields, ctor, getters, setters...
}
public class Account
{
private List<Transaction> _transactions;
....more fields, ctor, getters, setters...
}
public class Transaction
{
String _comment;
....more fields, ctor, getters, setters...
}
公共类登录
{
私人银行账户清单;
…更多字段、ctor、getter、setter。。。
}
公共类SimpleAccount
{
…更多字段、ctor、getter、setter。。。
}
公共类帐户
{
私人清单交易;
…更多字段、ctor、getter、setter。。。
}
公共类事务
{
字符串注释;
…更多字段、ctor、getter、setter。。。
}
然后,我将加载一个帐户模型,其中包含简化帐户(不包含所有事务),只有当用户请求查看特定帐户的事务时,我才会加载这个完整的帐户对象
那样行吗?有更好的方法吗?当您构建域模型时,您不应该考虑性能影响,因为域模型就是您的域,而不一定是您实现的
此外,如果您使用任何像样的ORM框架(例如),您可以只从DB加载所需的数据,而不是整个对象图。正如Serg所说,性能思想属于实现,而不是域模型所必需的 如果要避免加载整个帐户,应实施某种延迟加载,例如:
public class Account
{
private List<Transaction> _transactions;
public List<Transaction> getTransactions() {
if(_transactions == null) {
loadTransactions();
}
return _transactions;
}
}
公共类帐户
{
私人清单交易;
公共列表getTransactions(){
如果(_事务==null){
loadTransactions();
}
退货交易;
}
}
从您的问题中,我发现您的基本需求是ORM,因为(如果我没有错的话)您想要两件事域模型映射
但
对于lazzy加载
所谓延迟加载,我们的意思是,关系对象仅在我们尝试访问它们时加载。简单地说,当您希望查看特定的学生数据时,您永远不希望自动加载学生的所有课程(可以是一个集合),除非您不想查看他/她的课程(如果学生和课程有关系).
因此,对于您的问题,您应该使用ORM,它将为您提供两种解决方案:)
下面是.Net提供的有一种称为事件源的模式,听起来可能对您有所帮助。它依赖于事件的存储(在您的情况下,这些是事务),而不是运行总数,因此您可以对数据进行更多操作 此模式遇到的问题与您遇到的问题相同。所以在这个模式中增加了一个称为快照的元素。拍摄快照(比如在每个月底)将允许您拍摄一个时间点,并将事务记录加载回最近的快照。快照将显示快照点处的帐户(可能是上次快照或开户事件的产物,其间的所有事务都将被重播)
如果你在谷歌上搜索“事件源快照”,就会有很多文章讨论这种模式。希望这能有所帮助。对于一长串事务,您可以在服务器端进行分页,但在这种情况下,我会将DataAccess放入域模型中。@john84使用支持透明(对于域模型)外部加载的DAL。您可以通过分离接口和实现,将域模型与数据访问分开,例如,Account实现IAccount,或者通过引入ServiceLayer,例如:_transactions=serviceFactory.makeTransactionService().loadTransactions();
public class Account
{
private List<Transaction> _transactions;
public List<Transaction> getTransactions() {
if(_transactions == null) {
loadTransactions();
}
return _transactions;
}
}