Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/354.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我应该如何构造我的域模型_C#_Java_Architecture_Domain Driven Design_Domain Model_Entity Framework - Fatal编程技术网

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;
   }
}