库应该调用另一个存储库吗?或者存储库是否应该调用服务层?

时间:2009-09-01 20:25:49

标签: asp.net asp.net-mvc linq-to-sql repository-pattern

我想弄清楚如何解决这个问题。我必须在2个表中插入一些数据,然后将它们称为表A和表B.

Table A has these columns
AId<PK>
A1 
A2
A3

Table B has
AId<PK>
A1
B2
B3
B4

现在我的第一个问题是另一个存储库应该调用另一个存储库吗我不认为这会解决我目前的问题,但我只是想知道这一点以供将来参考?

现在我的问题。

当我在我的存储库层(TableARepository)中调用create来创建表A.我也立即创建了tableB的字段。

// linq to sql.
    TableA myATable = new TableA();
    dbContext.myATable.A1 = "hi";  // all these values would come from parameters.
    dbContext.myATable.A2 = "bye";
    dbContext.myATable.A3 = "go";

    dbContext.myATable.insertOnSubmit(TableA);
    dbContext.SubmitChanges();

    TableB myBTable = new TableB();
    dbContext.myBTable.AId = myATable.AId;
    dbContext.myBTable.A1 = myATable.A1;
    dbContext.myBTable.B2 = "2";
    dbContext.myBTable.B3 = "3";
    dbContext.myBTable.B4 = "4";

    dbContext.myATable.insertOnSubmit(TableB);
    dbContext.SubmitChanges();

所以我认为这很好,我认为我不需要为此服务层调用myBTable存储库(创建tableB)。

现在问题就在于此。当且仅当它不等于“hi”时,TableB表才应该将信息插入到该表中。

so param1 != "hi"  // insert 
   param1 == "hi"  // ignore and only insert table A

所以这意味着我必须像这样包装我的TableB

if(param1 != "hi")
{
   TableB myBTable = new TableB();
    dbContext.myBTable.AId = myATable.AId;
    dbContext.myBTable.A1 = myATable.A1;
    dbContext.myBTable.B2 = "2";
    dbContext.myBTable.B3 = "3";
    dbContext.myBTable.B4 = "4";

    dbContext.myATable.insertOnSubmit(TableB);
    dbContext.SubmitChanges();
}

现在我不确定我是否应该这样做,因为这看起来几乎像业务逻辑。但同时我不知道如何做这个业务逻辑,因为无论哪种方式我仍然必须传入值插入到create方法,即使它是null(A1是一个可空字段)。

所以我应该在TableA.Id,A1中调用tableB服务层传递并检查A1是什么。如果好,那么转到TableB存储库并以这种方式插入它?

所以TableARepostiory - &gt; TableB服务层 - &gt; TableBRepository(如果发现该值!=“hi”)。

所以我不知道该怎么做。

2 个答案:

答案 0 :(得分:10)

否 - 我无法想到存储库调用另一个存储库或其他服务的原因。他们唯一需要关心的是持久化您的实体并从数据存储中检索实体。除了基础域之外,它们应该对应用程序的大多数方面一无所知。

听起来你假设他们应该是每个表的存储库,这是不正确的。每个聚合根应该有一个存储库,该存储库应该负责将数据存储到所有底层的相关表中。存储库可以有一些与存储数据的位置或方式有关的逻辑,但最好在可能的情况下将其封装在公共区域中。

例如,如果你有人物对象并需要根据性别保存到不同的表,你可以使用继承(if(person is Woman)save here ...)或对象上的属性(if(如果) person.Gender == Gender.Female)在这里保存...)或规格(如果(FemaleSpecification.IsSatisfiedBy(person))保存在这里......)。

答案 1 :(得分:1)

guard子句(param1!=“hi”)应该位于更高层,例如应用程序服务层。

服务层应协调两个存储库。