如果存储库调用另一个存储库? 还是应该储存库调用一个服务层?(Should A reposito

2019-07-04 07:27发布

我试图找出如何解决这个问题。 我有一些数据插入到表2可以称他们为表A和B表

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

Table B has
AId<PK>
A1
B2
B3
B4

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

现在到了我的问题。

当我叫我的仓库层(TableARepository)创建,创建表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的)这或服务层。

现在,这里的问题。 表B表应该只有插入此表中的信息,当且仅当它不等于“嗨”。

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

因此这将意味着我将不得不缠上了我的表B这样的

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

现在,我不知道我是否应该在这里做这个,因为这看起来几乎像业务逻辑。 但在同一时间,我不知道如何做到这一点的业务逻辑,因为无论哪种方式,我仍然在价值传递给插入,即使它是空的创建方法(A1是一个可为空字段)。

所以,我应该叫在TableA.Id,A1的tableB的服务层通和检查A1是什么。 如果好然后去表B库并插入这样的说法?

所以TableARepostiory - >表B的服务层 - > TableBRepository(如果发现该值= “嗨”!)。

所以,我不知道该怎么做。

Answer 1:

否 - 我想不出有任何理由对储存调用另一个仓库,也没有其他服务。 他们唯一关心的,应坚持你的实体和从数据存储器检索实体。 他们应该是无知的,除了底层域应用程序的大多数方面。

这听起来像我们假定你是他们应为表库,这是不正确。 应该有每个聚合根的存储库,而库应该将数据存储到所有基础,相关表的照顾。 这是OK的仓库有一些逻辑属于哪里或如何保存数据,但它是最好的,在同一区域内进行封装时可能。

例如,如果你是有对象的人,需要按照性别保存到不同的表,你可以做到这一点使用继承(如果(人是女性),在这里保存......)或(在对象的属性,如果(person.Gender == Gender.Female)保存在这里...)或规范(如果(FemaleSpecification.IsSatisfiedBy(人))保存在这里...)。



Answer 2:

所述防护条款(参数1!=“HI”)应在更高的层,例如应用服务层。

服务层应该协调两个库。



文章来源: Should A repository call another repository? Or should a repository call a service layer?