2012-07-30 82 views
2

我尝试抽象我的特定领域的问题,以银行账户,假设以下情况:我应该如何架构我的域模型

  • 我有一定的客户的银行密码登录。
  • 每个客户可以拥有多个属于同一登录名的银行账户。
  • 每个银行账户可以有数千笔交易。

我设计的类结构folows(简体):

public class Login 
{ 
    private List<Account> _bankingAccounts; 
    ....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... 
} 

好了,但如果我有让我们说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... 
} 

然后我将加载与简化的帐户(不包含所有事务)一个账户模式,只有我的用户请求看交易一个特定账户我将加载这个单一的整个账户对象。

那样可以吗?有更好的方法吗?

+0

对于一长串事务处理,您可以执行服务器端分页 – JohnnBlade 2012-07-30 07:46:22

回答

6

从你的问题,我发现你的基本需求是ORM,因为(如果我没有错)你想要两件事
域模型映射

与lazzy loading
通过延迟加载我们的意思是,只有当我们试图访问它们时才会加载关系对象。简单地当你想看到一个你永远不想要的特定学生数据自动加载学生的所有课程(可能是一个集合),除非不想要t o见他/她的课程(如果学生和课程有关系)。因此,对于你的问题
你应该使用ORM将为您提供两种解决方案:)
下面是净

2

当您构建您的域名模型时,您不应该考虑性能问题,因为域模型是您的域名,而不一定是您实施的内容。此外,如果您使用任何体面的ORM框架(例如,),则可以从数据库中仅加载所需的数据,而不是整个对象图。

1

正如Serg所说,绩效思想属于实施,而不是必要的领域模型。

如果你想避免加载整个帐户,你应该实现某种延迟加载,例如:

public class Account 
{ 
    private List<Transaction> _transactions; 

    public List<Transaction> getTransactions() { 
     if(_transactions == null) { 
      loadTransactions(); 
     } 
     return _transactions; 
    } 
} 
+0

,但在这种情况下,我会将DataAccess放入域模型中。 – john84 2012-07-30 08:07:44

+0

@ john84使用支持透明(用于域模型)外部加载的DAL。 – 2012-07-30 08:08:54

+0

您可以通过分离接口和实现来将您的域模型从数据访问中分离出来,例如Account实现IAccount,或者通过引入ServiceLayer,例如:_transactions = serviceFactory.makeTransactionService()。loadTransactions(); – 2012-07-30 08:53:00

0

提供的list of some ORM有一个叫事件采购这听起来像它可以帮助你的模式。它依赖于事件的存储(在你的情况下,这些是事务),而不是运行总数,所以你可以做更多的数据。

此模式遇到了您遇到的相同问题。因此,这种称为快照的模式还有一个补充。拍摄快照,比如说在每个月的末尾,可以让您及时获取时间点并将交易记录载入最近的快照。快照将显示该帐户在快照点(可能是上次快照或帐户打开事件的产品,其中所有事务处于重播之间)。

如果您的Google'活动采购快照'有大量文章讨论该模式。希望这可以帮助。

相关问题