我是DDD的新人。在我们的DDD项目中,我们要求我们的DBContext只应公开AggregateRoots。假设我们的DbContext如下所示
public class ClassContext : DbContext
{
public DbSet<Class> Classes{ get; set; }
public DbSet<Students> Students{ get; set; }
}
和Class是聚合根。以下实施方式是否正确
public class ClassContext : DbContext
{
public DbSet<Class> Classes{ get; set; }
private DbSet<Students> Students{ get; set; }
}
感谢任何评论
答案 0 :(得分:0)
我认为不需要学生的私人声明。 据推测,Class对象包含类似
的内容<?php get_header(); ?>
<?php
$paged = ( get_query_var( 'paged' ) ) ? absint( get_query_var( 'paged' ) ) : 1;
// WP_Query arguments
$args = array (
'post_type' => the_post(),
'posts_per_page' => '3',
'paged' => $paged
);
?>
<?php
// The Query
$cquery = new WP_Query( $args );
while ( $cquery->have_posts() ) : $cquery->the_post();
?>
<div class="row">
<div class="img"><a href="<?php the_permalink() ?>" class="imgPos"><?php the_post_thumbnail('full'); ?></a></div>
<div class="text">
<h2><a href="<?php the_permalink() ?>" style="color:#545454;"><?php the_title(); ?></a></h2>
<h3 style="line-height: 1px;"><span class="floatL">By </span> <span class="floatL"> <?php the_author_posts_link(); ?> </span> <span class="floatL"> - </span> <span class="floatL"><?php the_time('F jS, Y'); ?></span><div class="clr"></div></h3>
<p><?php the_content('Read More') ?></p>
</div>
</div>
<?php
$post->ID;
endwhile;
$big = 999999999; // need an unlikely integer
?>
<div class="row">
<div class="pagination">
<?php
echo paginate_links( array(
'base' => str_replace( $big, '', esc_url( get_pagenum_link( $big ) ) ),
'format' => '?paged=%#%',
'current' => max( 1, get_query_var('paged') ),
'total' => $cquery->max_num_pages
) );
?>
</div>
</div>
<?php get_footer(); ?>
所以,鉴于要求您只展示聚合根,您找到学生的代码总是需要找到一个班级并从中拉出学生。
答案 1 :(得分:0)
考虑应用程序中的聚合根确实很有用,但不要尝试将DDD概念应用于Entity Framework类模型。
实体框架类模型不是域模型。这是一个数据访问层。关于包含或隐藏实体和/或导航属性的任何考虑都应该通过促进平滑的数据访问来激励,仅此而已。
您不太可能只是通过课程阅读/创建/更新/删除学生。这会产生不必要的笨重代码。谁说学生总是在课堂上?
但也许这不是聚合的最好例子。 Student
与Class
没有识别关系,因为下次他将在另一个班级。它与经典的Order-OrderLine
关系会有所不同。我可以想象,在这种情况下,您可能只会公开DbSet<Order>
。
所以只需将DbSet<Students>
公开为公共类。